我正在编写一个程序,用于查找给定数字是否为Armstrong Number:
int main()
{
int n,rem,sum=0;
cout<<"Enter the Number for checking"<<endl;
cin>>n;
while(n!=0)
{
rem=n%10;
sum=sum+(rem*rem*rem);
n=n/10;
}
if(sum==n)
{
cout<<"Armstrong Number"<<endl;
}
else
{
cout<<"It's not a armstrong number";
}
return 0;
}
当我运行它时,它总是报告&#34;它不是一个非常强的数字&#34;,无论输入如何。
我按如下方式更改了代码,并得到了正确的结果。但是我不明白为什么我需要为n1
分配输入并执行操作 - 为什么我不能直接使用n
进行操作?
int main()
{
int n,rem,sum=0,n1;
cout<<"Enter the Number for checking"<<endl;
cin>>n;
n1=n;
while(n1!=0)
{
rem=n1%10;
sum=sum+(rem*rem*rem);
n1=n1/10;
}
if(sum==n)
{
cout<<"Armstrong Number"<<endl;
}
else
{
cout<<"It's not a armstrong number";
}
return 0;
}
答案 0 :(得分:5)
在sum
行中,您的计划会比较n
和n
。在第二个程序中n==0
是用户输入的初始编号。但是在第一个程序if (sum==n)
中(参见上面的循环)。
因此,在第一个程序中,支票if (sum==0)
的作用为sum
。但main()
的值永远不为0(除非用户输入0)。所以,第一个程序总是返回“这不是一个非常强的数字”。
关于样式:使用函数而不是将整个逻辑放在一个int getSumOfCubesOfDigits(int n)
{
int sum = 0;
while (n)
{
const int rem = n % 10;
sum += rem * rem * rem;
n = n / 10;
}
}
函数中要好得多。例如,您可以创建一个函数来计算阿姆斯特朗数字的中间和:
int main()
{
int n;
cout << "Enter the Number for checking" << endl;
cin >> n;
if(getSumOfCubesOfDigits(n) == n)
cout<<"Armstrong Number"<<endl;
else
cout<<"It's not a armstrong number";
return 0;
}
在这种情况下,您的程序将变得更加简单,并且很难在您的问题的第一个程序中犯下错误:
Meteor 1.3
答案 1 :(得分:2)
在第一个程序中,原始数字输入'n'。你的逻辑中唯一的问题是,你忘了当你退出while循环时,'n'将不再是你的原始数字,因为你反复做n = n / 10,因此'sum == n'即使对阿姆斯特朗号码也不满意。
因此,在进入while循环之前,将原始数字保存到另一个变量中,例如n1(在您提供的第二个程序中完成),并且仅使用n1进行操作,即n1 = n1 / 10。单独留下n,以便最后'n'仍然包含原始数字,你最终可以将其与'sum'进行比较以找到你的答案。
答案 2 :(得分:1)
你比较哪个号码? ,在while循环的第一个程序中,n值被改变(在这个变量中得到输入),最后用sum == n检查,所以它总是得到条件失败。
因此需要temp(n1)变量来比较最终结果
答案 3 :(得分:0)
您的代码在第二个代码块中有所不同,您仍在测试sum = n。
在第二个代码块中,如果你测试了if(sum = n1),我会怀疑它是否会起作用。
答案 4 :(得分:0)
我找到了找到阿姆斯特朗数的方法
int main() {
for (int i=10; i<=9999; i++) {
int k = i,z = 1, s = 0, n = i;
while ((k/=10) > 0) z++;
for (int t = z; t; t--, n/=10) {
s += pow(n % 10, z);
}
if (i == s) cout << i << endl;
}
return 0;
}