题目要求:
常规做法代码:
#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位就可以了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。