我是C ++编程的新手,并且我的某个程序存在问题
#include <iostream>
using namespace std;
bool IsPerfect(int n);
int main ()
{
for(int i=1; i<100; i++){
IsPerfect(i);
}
return 0;
}
bool IsPerfect(int n){
int sum;
for(int x=1; x<n; x++){
if(n%x==0){
sum+=x;
return true;
cout <<n;
}
else{
return false;
}
}
}
我正在尝试创建一个列出完美数字的程序,但我找不到它不会打印的错误。
答案 0 :(得分:4)
我看到3个问题:
int sum;
此外,你只是写信给它,你从来没有以有用的方式阅读它。cout << n;
永远不会被击中。请尝试以下更正的代码:
#include <iostream>
#include <cassert>
using namespace std;
bool IsPerfect(int n)
{
int sum = 1;
for(int x = 2; x < n; ++x)
{
if(n % x == 0)
sum += x;
}
return sum == n;
}
int main ()
{
for(int i=1; i<100; i++){
if (IsPerfect(i))
cout << i << endl;
}
assert(IsPerfect(6));
assert(IsPerfect(28));
assert(IsPerfect(496));
return 0;
}
答案 1 :(得分:3)
在输出语句之前,您有return
语句:
return true;
cout <<n;
你需要交换这些语句的顺序,你也可能想要添加一个逗号或其他一些分隔符:
std::cout << n << ", " ;
return true;
我不确定您要返回的位置,因为您将在第一次输入if
语句时退出,这将在x
为1
时发生。
答案 2 :(得分:2)
如果你想捕捉完美数字 - 等于其除数之和的数字,对吗? - 你需要允许循环继续(和实际,总和,总和)而不返回。获取print语句和return语句,并在循环结束后放置它们;你应该检查你计算的总和是否等于n。
答案 3 :(得分:1)
所有这些答案都告诉你在回国前写下这个号码。但这忽略了这里糟糕的设计:你有一个功能决定一个数字是否完美;它不应该是那个决定如何处理这些信息的功能(打印,存储,通过网络发送,......)。
这也会使你的代码更具可读性,因为名称IsPerfect
具有误导性 - 它告诉读者这个函数只返回数字是否完美。因此,主函数中的循环读作“对于整数1到100,询问它是否完美并忽略答案”。这不是一个有用的程序。
完全从IsPerfect
删除cout行,然后将其放入main
:
for (int x = 1; x < 100; ++x) {
if (IsPerfect(x)) {
std::cout << x << '\n';
}
}
答案 4 :(得分:0)
试试这个
if(n%x==0){
sum+=x;
cout <<n;
return true;
}
答案 5 :(得分:0)
问题出在这里:
if(n%x==0){
sum+=x;
return true;
cout <<n;
}
关键字return
会立即结束该函数并返回适当的值(true
)。这意味着它后面的所有语句都不会被执行。请尝试以下方法:
if(n%x==0){
sum+=x;
cout <<n;
return true;
}
答案 6 :(得分:0)
除了其他人指出的问题之外,您永远不会计算正确答案,因为您没有初始化sum
变量。
变化
int sum;
到
int sum=0;