用户输入一个数字。
一个完美的数字是一个正整数,等于其正数本身的正分数之和。
例如6是一个完美的数字,因为6是(1、2和3(的总和,它是6。
#include <iostream>
using namespace std;
int main() {
int input;
int sum=0;
cout << "t Find perfect Numbers" << endl;
cout << "-------------------------------- n";
cout << "Enter an upper bound Number: ";
cin >> input;
for (int i=1; i<input; i++)
{
for(int u=1; u<i; u++)
{
if (i%u == 0)
{
sum += u;
}
}
if (sum == i)
{
cout << sum;
}
}
return 0;
}
运行此代码后,它要求我输入一个数字,一旦输入一个数字,程序就会退出而无需打印预期的结果。
您需要在第二个for
循环之前重置sum
。如果您不这样做,那么sum
将不断增加范围。
这意味着例如,在检查情况i == 6
之前,sum
的值在输入第二个循环之前等于6。然后,您将在此结束时获得sum == 12
,然后您的测试失败。
因此,在您的第一个循环的开始(或末尾(时,请将sum
重置为1:
for (int i=1; i<input; i++){
sum = 1; // <-- Don't forget this line !
for(int u=2; u < i/u ; u++) // Only going to square root and add u + i/u if i%u == 0
{
if (i%u == 0)
{
sum += u + i/u; // If i is divisable by u, it is divisable by i/u
}
}
if (sum == i)
{
std::cout << sum << std::endl;
}
}
bob__指出,转到sqrt(i(并一次添加u和i/u是足够的,并且大大减少了执行时间。
编辑:重置为1允许避免1循环的迭代
这将使您在用户范围内为您提供完美的数字
#include <iostream>
using namespace std;
int main()
{
int input;
int sum=0;
cout << "t Find perfect Numbers" << endl;
cout << "-------------------------------- n";
cout << "Enter an upper bound Number: ";
cin >> input;
for (int i=1; i<input; i++)
{
for(int u=1; u<i; u++)
{
if (i%u == 0)
{
sum += u;
}
}
if (sum == i){
cout << "n the perfect number is " <<sum;
}
sum = 0;
}
return 0;
}