【发布时间】: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语句。 -
您在输出中得到
-,因为您的乘法和进位逻辑溢出(并环绕为负数)。