Liczba Amstronga

0

Witam mam napisać programik w c# który znajdzie wszystkie 3 cyfrowe liczby Amstronga.Czyli liczbę równą sumie sześcianów swoich cyfr. Np: 371=33+73+1^3=371
Jakieś rady?
pozdrawiam.

0

pętla for + warunek :>

0

Pomocne...dzięki:>
Jestem zielony z c#..to trzeba zaznaczyć. Koncepcje już mam...niewiem tylko jak w c# zapisać aby powiedzmy liczbe int 10 traktował jako 1 i 0...tak aby każdy jej czynnik podniesc do potęgi.

0

Przy niedzielnym śniadanku i pysznej porannej kawce, wystukałem w jakieś 5 czy 10 minut (więc nie jest to zbyt genialny sposób ;-) ) coś takiego:

using System;

namespace Liczby_Amstronga
{
    class Szukacz
    {
        static void Main()
        {
            string liczba;
            int x, y, z;

            for (int i = 100; i < 1000; i++)
            {
                liczba = i.ToString();
                x = Int32.Parse(liczba[0].ToString());
                y = Int32.Parse(liczba[1].ToString());
                z = Int32.Parse(liczba[2].ToString());
                if ((Math.Pow(x, 3) + Math.Pow(y, 3) + Math.Pow(z, 3)) == i)
                    Console.Write(i + "\t");
            }
            Console.Write("\n\nWciśnij ENTER, aby zakończyć");
            Console.ReadLine();
        }
    }
}

Pozdrawiam,
Dawid

0

Primo: Trzeba było nie dawać gotowego rozwiązania, nic się nie nauczy ni pobawi ;)

Secundo: Rozwiązanie wyżej jest dość "naturalne", ale dość niewydajne, lepiej to zrobić za pomocą / i %

0

Jestem nowy na forum i nie pomyślałem, że zwyczaj nakazuje nie dawać gotowych rozwiązać, a jedynie wskazówki :) Sorry!
Ale temat mnie zaintrygował, gdyż nie słyszałem wcześniej o takich liczbach (możne dlatego, że nie interesuję się zbytnio matematyką). Cóż trzeba będzie zacząć... Ponieważ jednak, tamtem kod też mi się nie podobał, zamieszczam troszke zmodyfikowany.. Wydaje mi się, że bardziej wydajny. Mam nadzieję, że użytkownik, który o niego prosił mimo wszystko skorzysta na tym, a być może sam wymyśli jeszcze lepszy?

using System;

namespace Liczby_Amstronga
{
    class Program
    {
        static void Main()
        {
            int x, y, z;

            for (int i = 100; i < 1000; i++)
            {
                x = (i / 100);
                y = ((i - (x * 100)) / 10);
                z = (i - (x* 100) - (y * 10));

                if ((Math.Pow(x, 3) + Math.Pow(y, 3) + Math.Pow(z, 3)) == i)
                    Console.Write(i + "\t");
            }
            Console.Write("\n\nWciśnij ENTER, aby zakończyć");
            Console.ReadLine();
        }
    }
}

Pozdrawiam,
Dawid Niedzwiedz

0

Czasami ktoś oczekuje gotowego rozwiązania swojego problemu, ale karol21 prosił o rady, więc..

Co do kodu wyżej to nadal myślę, że bardziej czytelne (czy szybsze nie wiem, nie chce mi się NTime odpalać) będzie użycie "% 10" do wydobycia pierwszej z prawej cyfry, a "/10" do odcięcia jej.

0

Witam.
Dziekuje za pomoc. Na tej podstawie napisałem swój programik. Wersja dla 2 i 3 cyfrowych liczb.

{
int j,i,a,b,c;
int tablica[100];
for(j=10,i=0;j<100;j++)
{
b=j/10;
a=j%10;
if (j==(pow(b,2)+pow(a,2)))
{
// printf("\n %d %d %d ",j,b,a);
tablica[i]=j;
i++;
}
}
for(j=100;j<1000;j++)
{
c=j/100;
b=(j-(c*100))/10;
a=j%10;
if (j==(pow(c,3)+pow(b,3)+pow(a,3)))
{
// printf("\n %d %d %d %d ",j,c,b,a);
tablica[i]=j;
i++;
}
}
printf("\n liczby Armstronga :");
for(j=0;j<i;j++)
printf(" %d",tablica[j]);
getch();
}

0

No tak.. hmmm zbyt schludne to co zrobiłeś nie jest, poza tym tak do końca to nie jest też C# :)

Z ciekawości jeszcze napisałem coś co sprawdzi mi w dowolnym zakresie ile takich liczb jest...
Zaskoczyło mnie troszke, że jest ich tylko kilka, a sprawdziłem w 3 potędze zakres nawet do 10 000 000 :D choć trochę to trwało...
Dopiero po małej lekturce ( http://mathworld.wolfram.com/NarcissisticNumber.html ) okazało się, że aby uzyskać większe trzeba do większej potęgi podnosić :) Ale cóż - to logiczne - poza tym tak bywa, że się czegoś nie wie lub zapomniało :)

static void Main(string[] args)
        {
            int zakres, potega, wynik = 0;
            string rozklad;

            Console.Write("Podaj zakres: ");
            zakres = Convert.ToInt32(Console.ReadLine());
            Console.Write("Podaj potęgę: ");
            potega = Convert.ToInt32(Console.ReadLine());

            for (int i = 0; i <= zakres; i++)
            {
                rozklad = i.ToString();

                for (int j = 0; j < rozklad.Length; j++)
                    wynik += (int)Math.Pow(int.Parse(rozklad[j].ToString()), potega);

                if (wynik == i)
                    Console.Write(wynik + "\t");
                wynik = 0;
            }
            Console.WriteLine("\n\aWciśnij ENTER, aby zakończyc");
            Console.ReadLine();
        }

Pozdrawiam,
Dawid Niedzwiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1