目前我正在尝试构建一个程序,将所有的armtrongnumber打印到一定数量。我试图运行它时遇到一些奇怪的错误。它说缓冲区溢出。 导致它的部分似乎在main()中。谢谢你的帮助。
#include <stdio.h>
#define MAXIMUM 1000000
int ipow(int x, int power){
int z,t;
t = 0;
z = x;
for (t = 0; t < (power - 1); t++) {
z = z * x; }
return z;
}
int getLength(int x) {
int a;
a = 1;
for (a=1;1;a++) { if (x < ipow(10,a) && x >= ipow(10,(a-1))) return a; }
}
int getExpSum(int x) {
int summe,r,s,t;
int digit[8]={0,0,0,0,0,0,0,0};
summe=0;
s = getLength(x);
t = x;
r = 1;
for (s=getLength(x);s!=0;s--){
digit[s] = t % 10;
t = t / 10;
}
for(r=1;r<(getLength(x)+1);r++)
{
summe = summe + ipow(digit[r],getLength(x));
}
return summe;
}
int Armstrong (int x) {
if (getExpSum(x)==x) {
printf("%d ist eine Armstrongzahl\n", x);
return 1;
}
return 0;
}
void main(){
int z;
z = 0;
for (z=0;z<MAXIMUM;z++){
Armstrong(z+1);
}
}
答案 0 :(得分:1)
您的“getLength”功能存在问题(实际上是ipow)
传递getLength(1),结果为13,因为 ipow(10,1)和ipow(10,0)返回10,因此“getLength”条件失败,然后进行下一次迭代并继续..直到ipow返回由于整数大小而为10 ^ 13的负数。
在getExpSum中,数组的大小为8,它试图访问它的第13个元素。因此它崩溃了
将条件添加到ipow函数
int ipow(int x, int power){
int z,t;
t = 0;
z = x;
if (power == 0) //<-----add this condition to your code
return 1;
for (t = 0; t < (power - 1); t++) {
z = z * x; }
return z;
}
添加此条件后,我得到了正确的结果。
1 ist eine Armstrongzahl
2 ist eine Armstrongzahl
3 ist eine Armstrongzahl
4 ist eine Armstrongzahl
5 ist eine Armstrongzahl
6 ist eine Armstrongzahl
7 ist eine Armstrongzahl
8 ist eine Armstrongzahl
9 ist eine Armstrongzahl
153 ist eine Armstrongzahl
370 ist eine Armstrongzahl
371 ist eine Armstrongzahl
407 ist eine Armstrongzahl
1634 ist eine Armstrongzahl
8208 ist eine Armstrongzahl
9474 ist eine Armstrongzahl
54748 ist eine Armstrongzahl
92727 ist eine Armstrongzahl
93084 ist eine Armstrongzahl
548834 ist eine Armstrongzahl
BTW解决方案可以改进。