• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C# - Oblicz 1^1+2^2+3^3+...+n^n

Object Storage Arubacloud
+1 głos
610 wizyt
pytanie zadane 1 listopada 2018 w C# przez aXen Początkujący (390 p.)
zamknięte 1 listopada 2018 przez aXen

Witam,
Mam takie zadanie: "Wczytaj liczbę naturalną n>0 i oblicz 1^1+2^2+3^3+...+n^n . Nie można używać funkcji matematycznych."
Udało mi się uzyskać program, który liczy liczby n^n:
 

using System;

namespace _5._5
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, i, wynik=1;
            Console.Write("Podaj liczbę n: ");
            n = Convert.ToInt32(Console.ReadLine());
            if (n > 0)
            {
                for (i = 1; i <= n; i++)
                {
                    wynik *= n;
                }
                Console.WriteLine("{0}^{0}={1}", n, wynik);
            }
            else Console.WriteLine("Liczba n musi spełniać n>0");
            Console.ReadKey();
        }
    }
}

Lecz nie wiem jak to do siebie dodać, aby zaczynało się od jedynki i kończyło na n.

komentarz zamknięcia: Rozwiązane
komentarz 1 listopada 2018 przez mokrowski Mędrzec (155,460 p.)
edycja 1 listopada 2018 przez mokrowski
Poczytaj o algorytmie szybkiego potęgowania. W kodzie który masz jest to nieefektywne.

Np. dla 8^8, będziesz robił 7 mnożeń a wystarczy zauważyć że jest to (8^4)^2 ... a nawet ((8^2)^2)^2 czyli nie 7 a 3 mnożenia.

2 odpowiedzi

+1 głos
odpowiedź 1 listopada 2018 przez manjaro Nałogowiec (37,390 p.)
wybrane 1 listopada 2018 przez aXen
 
Najlepsza

Zadeklaruj wynik=0

A to co masz w pętli zmień na 

wynik+=i*i

 

komentarz 1 listopada 2018 przez aXen Początkujący (390 p.)

Nie działa dobrze po zmianie:

            int n, i, wynik = 0;
            Console.Write("Podaj liczbę n: ");
            n = Convert.ToInt32(Console.ReadLine());
            if (n > 0)
            {
                for (i = 1; i <= n; i++)
                {
                    wynik += i * i;
                }
                Console.WriteLine("{0}^{0}={1}", n, wynik);
            }
            else Console.WriteLine("Liczba n musi spełniać n>0");
            Console.ReadKey();

Wpisuje liczbę 3 i pokazuje mi wynik 14 zamiast 32.

komentarz 1 listopada 2018 przez Aisekai Nałogowiec (42,190 p.)
i*i to nie jest i^i. Najprościej byłoby wyrzucić kod liczący n^n do innej funkcji, zwracajacej jakiegoś inta/longa i w mainie wywolywac ta funkcję dla 1,2,3,4...,n i wynik zwrócony przez funkcje dodawać do zmiennej wynik.
komentarz 1 listopada 2018 przez manjaro Nałogowiec (37,390 p.)
a przepraszam, faktycznie pomyliłem potęgowanie z mnożeniem. W takim razie można napisać inaczej ale jest to totalnie bez sensu aby nie używać funkcji potęgowej bo znacznie wydłuża działanie programu Za chwilę podam rozwiązanie.
1
komentarz 1 listopada 2018 przez manjaro Nałogowiec (37,390 p.)

Coś takiego będzie działać i myślę że jest na tyle prosto że to rozumiesz. Problem w tym że jest to fatalnie pod względem optymalizacji. No ale skoro tak miało być...

using System;
 
namespace _5._5
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, wynik=0;
            Console.Write("Podaj liczbę n: ");
            n = Convert.ToInt32(Console.ReadLine());
            if (n > 0)
            {
                for (int i = 1; i <= n; i++){
                	int potega=1;
                	for (int  j = 1; j <= i; j++){
                    	potega *=i;
                	}
        			wynik+=potega;           
                }
                Console.WriteLine("{0}^{0}={1}", n, wynik);
            }
            else Console.WriteLine("Liczba n musi spełniać n>0");
            Console.ReadKey();
        }
    }
}

 

1
komentarz 1 listopada 2018 przez aXen Początkujący (390 p.)
Wszystko rozumiem, dzięki!
+1 głos
odpowiedź 1 listopada 2018 przez X3h Dyskutant (9,540 p.)
static void Main(string[] args){
	
	Console.Write("Podaj liczbę naturalną większą od zera: ");
	int input;

	try{
		input = Convert.ToInt32(Console.ReadLine());
		if(input <= 0){
			Console.WriteLine("Podana liczba nie spełnia założeń.");
			Console.ReadKey();
			return;
		}
	}
	catch(Exception){
		Console.WriteLine("Podano złe dane.");
		Console.ReadKey();
		return;
	}

	long sum = 0;
	
	Func<int, long> power = (n) => {
		long product = 1;
		for(int i = 0; i < n; ++i) {
			product *= n;
		}
		return product;
	};

	for(int i = 1; i <= input; ++i){
		sum += power(i);
	}

	Console.WriteLine(sum);
	Console.ReadKey();

}

Funkcję pow jako lambda można napisać jak zwykłą, ale wtedy należałoby stworzyć osobną klasę, ponieważ Main z założenia ma uruchamiać kolejne moduły/klasy. Dawno nie pisałem w C#, ale wygląda dobrze.

komentarz 1 listopada 2018 przez aXen Początkujący (390 p.)
No tak, ale możemy tylko użyć pętli oraz warunków do tego. Nie chcę wychodzić poza zakres realizowanego materiału.
komentarz 1 listopada 2018 przez X3h Dyskutant (9,540 p.)
static void Main(string[] args){

	Console.Write("Podaj liczbę naturalną większą od zera: ");
	int input = Convert.ToInt32(Console.ReadLine());

	// Zakładam, że wyjątek nie wystąpi
	if(input <= 0){
		Console.WriteLine("Podana liczba nie spełnia założeń.");
		Console.ReadKey();
		return;
	}

	long sum = 0;

	for(int i = 1; i <= input; ++i){
		long product = 1;
		for(int j = 0; j < i; ++j){
			product *= i;
		}
		sum += product;
	}

	Console.WriteLine(sum);
	Console.ReadKey();

}

Następnym razem przedstaw proszę wszystkie założenia.

Podobne pytania

0 głosów
1 odpowiedź 282 wizyt
pytanie zadane 19 października 2020 w JavaScript przez Elmejs Nowicjusz (190 p.)
0 głosów
3 odpowiedzi 1,047 wizyt
0 głosów
0 odpowiedzi 351 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...