为什么我的c ++代码无法找到阶乘?

时间:2019-11-26 20:05:50

标签: c++ debugging

#include <iostream>
using namespace std;


int main() {
    int n, t;
    cin >> n;
    int i;
    for(i = 0; i < n; i++){
        cin >> t;
        int arr[200];
        arr[0] = 1;
        int j;
        for(j = 1; j < 200; j++) arr[j] = 0;
        int l = 1, k;
        for(j = 1; j <= t; j++){
            int rem = 0, flag = 0;
            for(k = 0; k < l; k++){
                int temp = (arr[k]*j) ;
                arr[k] = (temp + rem) % 10;
                rem = (temp+rem) / 10;
                if(k == l-1 && rem != 0){
                    arr[l] = rem;
                    flag = 1;
                }
            }
            if(flag) l++;
        }
        while(l--){
            cout << arr[l];
        }
        if(i != n-1){
            cout << "\n";
        }
    }
    return 0;
}

问题陈述:  要求您计算一些小的正整数的阶乘。 输入:

整数n,1 <= n <= 100,表示测试用例的数量,后跟n行,每行包含一个整数t,1 <= t <= 100。 输出:

对于输入中给定的每个整数n,显示一行t值!

这对于t <35可以正常工作,但是对于t> = 35则开始给出错误。 还告诉我如何改善编码风格。我是编码新手。

案例1
样本输入:
2
1
35

实际输出:
1
-40427027-3-786144929666651337523200000000

预期输出:
1
10333147966386144929666651337523200000000

案例2
样本输入:
3
5
6
7

实际输出:
120
720
5040

预期输出:
120
720
5040

对不起,最初的问题已更改,因为在计算17时我忽略了浮点错误!来自科学计算器。现在,代码不适用于大于34的值

部分原因是rem可以是3位数,因此以10为底的潜水无效。需要注意rem> 100

1 个答案:

答案 0 :(得分:1)

您的那部分代码看起来不对,因为它只能循环到您的数字长度 因此当有标志时,它只能增长一位数字:

        for(k = 0; k < l; k++){
            int temp = (arr[k]*j) ;
            arr[k] = (temp + rem) % 10;
            rem = (temp+rem) / 10;
            if(k == l-1 && rem != 0){
                arr[l] = rem;
                flag = 1;
            }
        }
        if(flag) l++;

应该更短一些:

   for(k = 0; k < l; k++) {
        rem += arr[k] * j;
        arr[k] = rem % 10;
        rem /= 10;
        if(k == l-1 && rem != 0) ++l;
    }