Переполнение буфера чисел Армстронга

В настоящее время я пытаюсь создать программу, которая печатает все номера армстронга до определенного числа. Я получаю странную ошибку при попытке запустить это. Пишет переполнение буфера. Часть, вызывающая это, кажется, находится в 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);
    }
}

person user1803470    schedule 06.11.2012    source источник
comment
for (a=1;a=a;a++) сложно и бесполезно.   -  person UmNyobe    schedule 06.11.2012
comment
@user1803470: for (a = 1; ; ++a). Или for (a = 1; 1; ++a), если вам не нравится внешний вид пустого условия, но некоторые компиляторы предупредят вас об этом.   -  person Steve Jessop    schedule 06.11.2012
comment
Изменил на 1. Спасибо. Основная ошибка все еще там, хотя.   -  person user1803470    schedule 06.11.2012


Ответы (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

Кстати, решение можно улучшить.

person kalyan    schedule 06.11.2012
comment
Да наверное можно сделать. Однако я недавно начал изучать C, и поэтому я рад, если вообще получу рабочее решение. Благодарю вас! - person user1803470; 06.11.2012