【问题标题】:why my c++ code to find factorials is not working?为什么我的用于查找阶乘的 C++ 代码不起作用?
【发布时间】:2019-11-26 20:05:50
【问题描述】:
#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,显示一个值为 t 的行!

这在 t = 35 时开始出现错误。 还告诉我如何改进我的编码风格。我是编码新手。

案例 1
样本输入:
2
1
35

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

预期输出:
1
10333147966386144929666651337523200000000

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

实际输出:
120
720
第5040章

预期输出:
120
720
第5040章

PS 对不起!最初的问题发生了变化,因为我在计算 17 时忽略了浮点错误!从科学计算器。现在,代码不适用于大于 34 的值

错误的部分原因是 rem 可以是一个 3 位数的数字,因此 10 的潜水不起作用。需要照顾rem > 100

【问题讨论】:

  • 我会说溢出。 factorial(100)9.332622e+157 附近。
  • 你知道17! 的值是多少吗?将其与 int 可以保持的最大值进行比较
  • 能否添加输入、预期输出和实际输出?
  • 另外,请将“示例输入”放入程序本身。换句话说,将变量设置为已知(错误)输入——不需要cin 语句。
  • 您在输出中得到-,因为您的乘法和进位逻辑溢出(并环绕为负数)。

标签: c++ debugging


【解决方案1】:

您的那部分代码看起来有问题,因为它只循环到您的号码长度 所以当有flag时它可能只会增长一位数:

        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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 2019-10-28
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多