用户输入一个数字,例如100。我们需要在1到100之间找到一个理想的数字。
一个理想数是一个正整数,等于它的正除数之和,不包括数字本身。
例如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;
}
运行此代码后,它要求我输入数字,一旦输入数字,程序将退出而不打印预期结果。
答案 0 :(得分:3)
您需要在第二个sum
循环之前重置for
。如果您不这样做,那么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次迭代
答案 1 :(得分:-1)
这将为您提供用户范围内的所有完美数字
JSON.parse