Program do szukania liczb doskonałych z zadanego przedziału

Program do szukania liczb doskonałych z zadanego przedziału
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,

Kombinuje sobie z programem do szukania liczb doskonałych w przedziale <1,n>, n podaje użytkownik.

Mam takie coś

Kopiuj
 class Program
    {
        static void Main(string[] args)
        {
            long n;
            long w=0;
    
            Console.WriteLine("Podaj koniec przedziału sprawdzenia czy liczba jest doskonała : ");
            n = long.Parse(Console.ReadLine());

            while (w!=n)
            {
                
                for (long i = 1; i <= (n/2); i++)
                {
                    if ((n % i) == 0)
                        w += i;
                }
               
                if (w == n)
                {
                    Console.WriteLine("Liczba doskonała : {0}",w);
                }

                --n;
                w = 0;
            }
            Console.WriteLine("Koniec");
            Console.ReadKey();  
        }
    }
}

Liczby wyświetla, pewnie można to napisać lepiej, chodzi mi o to żeby przerobić to tak żeby wyświetlał po kolei od 1 do n, w moim przypadku jest odwrotnie a aktualnie mam jakiś zanik mózgu żeby to rozkminić.

dodanie znacznika <code class="csharp"> - @furious programming

matoung
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 53
0

Nie wiem czy dobrze zrozumiałem treść pytania. Mógłbyś wrzucić pod pętle for polecenie

Kopiuj
Console.WriteLine("Liczba doskonała : {0}",w); 
  • Rejestracja: dni
  • Ostatnio: dni
0

Chodziło mi, że podając np. 1000 Wynik wygląda tak:

Kopiuj
Podaj koniec przedziału sprawdzenia czy liczba jest doskonała :
1000
Liczba doskonała : 496
Liczba doskonała : 28
Liczba doskonała : 6
Koniec

Więc sprawdza od 1000 w dół.

zamiana znacznika <quote> na <code class="none"> - @furious programming

doktorko
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gallifrey
  • Postów: 44
0

Damn, na drugi raz muszę sprawdzać tag, bo na pierwszy rzut oka myślałem że to kod Javy :p
Ciekawe w którym roku robiłem ostatnio cokolwiek w .NET , hmmmm.
Obczaj to:

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _4Programmers_meow1
{
    class Program
    {
        static void Main(string[] args)
        {
            long n, w = 0;

            Console.WriteLine("Podaj koniec przedziału sprawdzenia czy liczba jest doskonała : ");
            n = long.Parse(Console.ReadLine());
            List<long> perfect = new List<long>();

            while (w != (n--))
            {
                for (long i = 1; i <= (n / 2); i++)
                {
                    if ((n % i) == 0)
                        w += i;
                }
                if (w == n)
                {
                    perfect.Add(w);
                }
                w = 0;
            }

            perfect.Reverse();
            foreach(long l in perfect){
                Console.WriteLine("Liczba doskonała : {0}", l);
            }

            Console.WriteLine("Koniec");
            Console.ReadKey();
        }
    }
}
doktorko
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gallifrey
  • Postów: 44
0

Jeszcze wersja z lambda wyrazeniami:

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _4Programmers_meow1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;

            Console.WriteLine("Podaj koniec przedziału sprawdzenia czy liczba jest doskonała : ");
            n = int.Parse(Console.ReadLine()) + 1;
            List<int> perfect = new List<int>();

            while (--n > 0)
            {
                if (IsPerfect(n))
                {
                    perfect.Add(n);
                }
            }

            perfect.Reverse();
            foreach (int l in perfect)
            {
                Console.WriteLine("Liczba doskonała : {0}", l);
            }

            Console.WriteLine("Koniec");
            Console.ReadKey();
        }

        static bool IsPerfect(int num)
        {
            return Enumerable.Range(1, num - 1).Sum(n => num % n == 0 ? n : 0) == num;
        }
    }

}

Poza tym zero nie jest liczba doskonałą

In number theory, a perfect number is a **positive ** integer that is equal to the sum of its proper positive divisors, that is, the sum of its positive divisors excluding the number itself (also known as its aliquot sum).

SO
  • Rejestracja: dni
  • Ostatnio: dni
1

Jakbyś sam to pisał to byś umiał przerobić.

Kopiuj
int max = int.Parse(Console.ReadLine());
foreach (var p in Enumerable.Range(1, max).Where(x => x == Enumerable.Range(1, x/2).Where(y => x%y == 0).Sum()))
{
    Console.WriteLine(p);
}
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.