以下是我生成Armstrong numbers的简单尝试。但它只输出“1”。什么可能是错的?
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
int main()
{
clrscr();
int r;
long int num = 0, i, sum = 0, temp;
cout << "Enter the maximum limit to generate Armstrong number ";
cin >> num;
cout << "Following armstrong numbers are found from 1 to " << num << "\t \n";
for(i=1;i<=num;i++)
{
temp = i;
while( temp != 0 )
{
r = temp%10;
sum = sum + r*r*r;
temp = temp / 10;
}
if ( i == sum ) {
cout << i;
sum = 0;
}
}
getch();
return 0;
}
答案 0 :(得分:5)
您需要始终在for-i-loop中设置sum = 0
。
答案 1 :(得分:3)
阿姆斯特朗数字:n位数字等于其数字的第n个幂的总和。
从您的代码中
sum = sum + r*r*r;
'r * r * r'不是数字的幂数。
答案 2 :(得分:2)
您可以使用log:
计算nn = log(i)+1
然后正确计算r^n
并在求和中使用它:sum += r^n;
。 r * r * r不是计算它的正确方法。
答案 3 :(得分:2)
首先,你假设n(如第n次幂)总是三(在r*r*r
中)。只有当您的初始值有三位数时才会出现这种情况(与153示例一样)。
您需要计算初始数字中的数字来计算n,然后将r*r*r
替换为将r提升到n次幂。
但这并不能解释为什么没有找到153。原因是您没有将sum
重置为零,除非找到匹配项。无论你是否找到匹配,都需要将其重置为零。
答案 4 :(得分:0)
您的代码仅适用于n=3
:sum = sum + r*r*r;
您必须使用pow()
函数(http://www.codecogs.com/reference/c/math.h/pow.php)来计算能力。 (或者创建一个自定义的。)
答案 5 :(得分:0)
总结正确但部分答案:
// #include <math.h>
for (long int i = 1; i <= num; i++)
{
long int n = 0, sum = 0; // <--- here
long ing temp = i;
while ( temp != 0 )
{
++n;
temp /= 10;
}
temp = i;
while ( temp != 0 )
{
int r = temp%10;
sum += int(pow(double(r), n)); // <-- here
temp /= 10;
}
if ( i == sum )
{
cout << i;
sum = 0;
}
}
答案 6 :(得分:0)
@ Power-inside,我看到你的代码,很难改变你的代码并编辑它,但是我写了一个类似的代码来生成给定限制的Armstrong数字,并且它工作正常。 这是....
#include<iostream.h>
#include<conio.h>
class arm
{
int a;
public:
void display();
};
void arm::display()
{
cout<<"Enter any number to find armstrong numbers less than it";
cin>>a;
for(int i=a;i>=1;i--)
{
int d=i;
int b=i;
int c=i;
int count=0;
while(b!=0)
{
b=b/10;
count++;
}
int l,m;
m=0;
for(int k=1;k<=count;k++)
{
l=c%10;
c=c/10;
m=m+l*l*l;
}
if(d==m)
cout<<d<<"\t";
}
}
void main()
{
arm k;
k.display();
getch();
}