“如果一个整数的因子(包括一个(但不是数字本身))与数字相加,则该整数被认为是一个完整的数字。例如,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种不同?
非常感谢
答案 0 :(得分:18)
你可以帮我做下面的练习吗?
是。我会告诉你如何找到你的错误,而不是告诉你错误的位置。更好的是,相同的技术将首先降低导致错误的几率。
这里的关键是将问题分解成小部分,每个小部分都可以独立进行测试。你已经开始这样做了!您有两种方法:Main
和IsItPerfect
。 您应该至少有三种方法。你应该拥有的方法是:
IsDivisor
- 取两个整数,如果第一个除以第二个,则返回true。GetAllDivisors
- 取整数,返回所有除数的列表Sum
- 获取整数列表,返回总和您的方法IsPerfect
应该调用GetAllDivisors
和Sum
并将总和与原始数字进行比较,并且所有应该正在进行。您的方法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);
}