0

現在、特定の数まですべてのarmstrongnumbersを出力するプログラムを作成しようとしています。これを実行しようとすると、奇妙なエラーが発生します。バッファオーバーフローと表示されます。それを引き起こしている部分は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);
    }
}
4

1 に答える 1

1

「getLength」関数 (実際には ipow) に問題があります

getLength(1) を渡すと、ipow(10, 1) と ipow(10, 0) が 10 を返すため、結果が 13 になるため、「getLength」条件が失敗し、次の反復に進み、ipow が a を返すまで続きます。整数サイズのため、負の数は 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

ところで、ソリューションを改善することができます。

于 2012-11-06T15:35:48.867 に答える