OJ刷题--3.2.1 Factorials 阶乘(大数的存贮问题)
发布时间:2020-12-14 02:20:49 所属栏目:大数据 来源:网络整理
导读:?题目要求: 常规做法代码: #includeiostream#includestringusing namespace std;int main(){ long long i,j,n,N,s=1; long long num[1000]; cinN; for(i=1; i=N; i++)//先存贮该数的阶乘积 { s*=i; } i=0; while(s!=0)//分离该数的各个位数并用数组存贮 {
?题目要求: 常规做法代码: #include<iostream> #include<string> using namespace std; int main() { long long i,j,n,N,s=1; long long num[1000]; cin>>N; for(i=1; i<=N; i++)//先存贮该数的阶乘积 { s*=i; } i=0; while(s!=0)//分离该数的各个位数并用数组存贮 { num[i++]=s%10; s/=10; } n=i; for(j=0; j<n; j++) { if(num[j]!=0) { cout<<num[j]<<endl;//输出不为0的最低位 break; } } return 0; }
输入大数后数据溢出的结果: ? 正确的做法: #include <iostream> #include <string> using namespace std; long long arr[1000]; int main() { int N,i=1; cin>>N; arr[0]=1; while(i<=N) { arr[i]=arr[i-1]*i; while(arr[i]/10!=0&&arr[i]%10==0) { arr[i]/=10; } arr[i]%=1000; i++; } while(arr[N]%10==0) { arr[N]/=10; } cout<<arr[N]%10; return 0; }
? 总结: 这个题目最主要的问题就是阶乘之后的数字太大,没有哪个类型能放下,但是题目只要求输出最后的非零数字,这样就不必保留全部位的数字了,只需保留第一位非零数字及其前面的3位就可以了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |