C#完美数字练习

时间:2013-08-29 20:20:24

标签: c# math perfect-numbers

你可以帮我做下面的运动吗? (这不是家庭作业,只是我正在使用的书中的练习。)

“如果一个整数的因子(包括一个(但不是数字本身))与数字相加,则该整数被认为是一个完整的数字。例如,6是一个完整的数字,因为6 = 1 + 2 + 3。写入方法完美,确定参数值是否为完美数字。在确定并显示2到1000之间的所有完美数字的应用程序中使用此方法。显示每个完美数字的因子以确认数字确实完美。“< / p>

所以这就是我到目前为止所得到的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Perfect_Numbers2
{
    class Program
    {
        static bool IsItPerfect(int value)
        {
            int x = 0;

            int counter = 0;

            bool IsPerfect = false;

            List<int> myList = new List<int>();

            for (int i = value; i <= value; i++)
            {
                for (int j = 1; j < value; j++)
                {
                    // if the remainder of i divided by j is zero, then j is a factor of i
                    if (i%j == 0) {
                        myList[counter] = j; //add j to the list
                        counter++;
                    }
                    for (int k = 0; k < counter; k++)
                    {
                        // add all the numbers in the list together, then
                        x = myList[k] + myList[k + 1]; 
                    }
                    // test if the sum of the factors equals the number itself (in which case it is a perfect number)
                    if (x == i) {
                        IsPerfect = true;
                    }
                }
                Console.WriteLine(i);
            }
            return IsPerfect;
        }
        static void Main(string[] args)
        {
            bool IsItAPerfectNum = false;

            for (int i = 2; i < 1001; i++)
            {
                IsItAPerfectNum = IsItPerfect(i);
            }
        }
    }
}
你会怎么做?我的代码可修复吗?你会怎么解决它?谢谢!

我在行myList [counter] = j时遇到错误; (索引超出了范围)而且它没有显示像它应该的完美数字....

编辑=我做了一些改变;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Perfect_Numbers2
{
class Program
{
    static bool IsItPerfect(int value)
    {
        int x = 0;

        int counter = 0;

        bool IsPerfect = false;

        List<int> myList = new List<int>();

        for (int i = value; i <= value; i++)
        {
            for (int j = 1; j < i; j++)
            {
                if (i%j == 0)  // if the remainder of i divided by j is zero, then j is           a factor of i
                {
                    myList.Add(j); //add j to the list


                }
                x = myList.Sum();
                if (x == i)                        // test if the sum of the factors       equals the number itself (in which case it is a perfect number)
                {
                    IsPerfect = true;
                }

        }
            Console.WriteLine(i);
        }
        return IsPerfect;
    }
    static void Main(string[] args)
    {
        bool IsItAPerfectNum = false;

        for (int i = 2; i < 1001; i++)
        {
            IsItAPerfectNum = IsItPerfect(i);
            Console.WriteLine(IsItAPerfectNum);
            Console.ReadKey(true);
        }
    }
  }
  }

现在我可以循环遍历所有数字直到1000并显示它是否完美(真或假)[这不是练习所要求的,但它是向正确方向迈出的一步(练习说它应该只显示完美的数字)]。

无论如何,奇怪的是它在第24位表示正确,这不是一个完美的数字.... http://en.wikipedia.org/wiki/Perfect_numbers#Examples

为什么24种不同?

非常感谢

6 个答案:

答案 0 :(得分:18)

  你可以帮我做下面的练习吗?

是。我会告诉你如何找到你的错误,而不是告诉你错误的位置。更好的是,相同的技术将首先降低导致错误的几率。

这里的关键是将问题分解成小部分,每个小部分都可以独立进行测试。你已经开始这样做了!您有两种方法:MainIsItPerfect您应该至少有三种方法。你应该拥有的方法是:

  • IsDivisor - 取两个整数,如果第一个除以第二个,则返回true。
  • GetAllDivisors - 取整数,返回所有除数的列表
  • Sum - 获取整数列表,返回总和

您的方法IsPerfect应该调用GetAllDivisorsSum并将总和与原始数字进行比较,并且所有应该正在进行。您的方法GetAllDivisors应该调用IsDivisor,依此类推。

您无法轻易找到错误,因为您的方法做得太多了。如果你没有得到正确的结果并且你有四种方法而不是一种方法,那么你可以独立测试每种方法以确保它有效,或者如果没有则修复它。

答案 1 :(得分:0)

您遇到的24问题有一些帮助:24正在返回true,因为您实际上正在检查是否在每个其他因素上都是完美的。所以24在这里翻转为真:

Factors of 24 | Total so far
    1                1
    2                3
    3                6
    4                10
    6                16
    8                24     <-- returns true
    12               36     <-- should be false, but flag is never reset

答案 2 :(得分:0)

你的第一个for循环将只执行一次。

for (int i = value; i <= value; i++)

例如,对于value = 6

for (int i = 6; i <= 6; i++)

答案 3 :(得分:0)

我刚刚完成了同样的练习,这本书来自Deitel先生的一本非常好的名为visual c#2012的书。

我开始解决的方法是,我开始研究如何计算数字的阶乘,然后慢慢地从那里继续建立。

由于您正在阅读同一本书,我建议您不要使用那些章节练习中未涵盖的内容,例如您使用过的列表集合,因为这会使练习变得不必要。并否定了作者提出的学习方法。

这是我的代码,希望能以某种方式帮助你。

class Program
{

    static  int factorTotal = 1;

    static void Main(string[] args)
    {

            int count = 1;
            while (count <= 10000)
            {
                bool isPerfect = IsPerfectNumber(count);

                if (isPerfect && (factorTotal >1))
                {
                    Console.WriteLine("Is Perfect: {0}", factorTotal);

                }              

                factorTotal = 1;
                count++;
            }               


    } // end main

    static bool IsPerfectNumber(int n)
    {
        int temp;
        int counter = 2;

        bool IsPerfect = false;

        while (counter <= (n - 1))
        {
            temp = n % counter;
            if (temp == 0)  // if true than factor found
            {

                factorTotal = factorTotal + counter;
            }

            counter++;
        }

        if ((factorTotal) == n)
            IsPerfect = true;

        else
            IsPerfect = false;

        return IsPerfect;
    }

}//end class

答案 4 :(得分:0)

在您的控制台应用程序的主要方法下复制并粘贴下面的代码。 我在代码的最后解释了几件事......

=============================================== ======================

{
        Console.WriteLine("perfect numbers/n");
        Console.Write("Enter upper limit: ");
        int iUpperLimit = int.Parse(Console.ReadLine());
        string sNumbers = "";
        List<int> lstFactor = new List<int>();

        for(int i = 1;i<=iUpperLimit;i++)
        {
            for(int k = 1;k<i;k++)
            {
                if (i % k == 0)
                {
                    lstFactor.Add(k); //this collect all factors
                }
                if (k == i-1)
                {
                    if (lstFactor.Sum() == i) //explain1
                    {
                        sNumbers += " " + i;
                        lstFactor.Clear(); //explain2
                        break;
                    }
                    else
                    {
                        lstFactor.Clear(); //explain2
                    }
                }
            }
        }

        Console.WriteLine("\nperfect numbers are: " + sNumbers);
        Console.ReadKey();
    }
}

=============================================== ======================== 请注意,i是我们测试的数字,k是其因素。

explain1 =&gt;我们添加了收集的所有因素并检查它们是否等于i(我们只是检查i是否是完整数字)

explain2 =&gt;我们必须清除列表才能检查下一个数字i是否是一个完整的数字,以便前一个数字的因子不会干扰当前数字的因素。

答案 5 :(得分:0)

    int start=1;
    int end=50;

    for(int a=end ; a > start ;a--)
    {
        int b=1;
        int c=0;
        bool x=false;

        for(int i=1 ; i < a ;i++)
        {
            b=a/i;
                if(b*i==a)
                {
                    c+=i;
                }
                if(c==a & i==a/2)
                {
                    x=true;
                }
        }
        if(x==true)
        Console.Write("{0} is : {1}",a,x);
    }