2016-11-24 4 views
1

Следующий код вычисляет факториал входного целого. Я запустил его в Codeblocks для 2 тестовых случаев - 9 & 2 и получил правильный результат. Для того же входа идеал выводит факториал 2 как 6, но он выводит 9 факториалов правильно. Что происходит не так? Кроме того, когда я делаю b статическим массивом размером 200 вместо динамического, ideone дает правильный вывод.Различные выходные данные в идеоне и кодовые блоки для одного и того же ввода (малые факториалы)

#include <iostream> 
#include <cstdio> 
using namespace std; 
int main(){ 
    int t,i,j,k,temp,carry=0,len=0; 
    scanf("%d",&t); 
    int *b=new int; 
    int *a=new int[t]; 
    for (i=0;i<t;i++){ 
     scanf("%d",&a[i]); 
     } 
    for (i=0;i<t;i++){ 
     len=0; 
     b[0]=1; 
     for (j=1;j<=a[i];j++){ 
      carry=0; 
      for (k=0;k<=len;k++){ 
       temp=b[k]*j+carry; 
       b[k]=temp%10; 
       carry=temp/10; 
       } 
      while (carry!=0){ 
      b[++len]=carry%10; 
      carry/=10; 
      } 
     } 
     for (j=len;j>=0;j--){ 
      printf("%d",b[j]); 
      } 
     printf("\n"); 
    } 
    return 0; 
} 
+0

'междунар * б = новый INT;' - Почему вы используете указатель здесь? Почему бы просто не объявить 'int'? – PaulMcKenzie

+0

Кроме того, я не понимаю, что вы вводите в свою программу. Вы говорите, что вы вводите '9' и' 2', но ваша программа показывает, что 'scanf' вызывается в цикле. Почему бы просто не жестко закодировать данные в программе, чтобы никто не запутался? – PaulMcKenzie

ответ

1
int *b=new int; 

выделяет только один объект для b. После этого действительны только b[0] или *b. b[k] недействителен для значений k кроме 0. Следовательно, ваша программа имеет неопределенное поведение.

Если статический массив размером 200 работ, то

int *b=new int[200]; 

должен работать.


Если размер массива известен во время компиляции, я бы посоветовал использовать массив, а не с использованием динамически выделенной памяти. Предпочитают

int b[200]; 

над

int *b=new int[200]; 
+0

Спасибо, у меня есть это сейчас. Но есть ли особая причина, почему статический массив должен быть предпочтительнее динамического? –

+0

@NikhilKaushik, Есть несколько причин использовать статические массивы, если можете. Динамические массивы требуют большего количества кода для управления распределением и освобождением. Гораздо дороже использовать динамически выделенную память - время выполнения должно вести бухгалтерскую работу. –

Смежные вопросы