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

0

Witam,

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

Mam takie coś

 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

0

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

Console.WriteLine("Liczba doskonała : {0}",w); 
0

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

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

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:

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();
        }
    }
}
0

Jeszcze wersja z lambda wyrazeniami:

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).

1

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

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);
}
0

Dzięki.

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