大数相乘 ----- 洛谷【P1009】

从来没有写过大数相加,大数相乘,2333,第一次手写,记录一下。

慢慢+满满的bug、、、

这是一个很简单的阶乘,最大的问题是  20!的阶乘太大了,只能通过大数模拟或者( java大法、python大法)来写,

宁夏站iupc的教训就是吃了大数相乘、大数相加的坑( 幸亏队友会 )。

多补补之前的坑,希望能拿到金。

思路:

  到没有什么,有几个坑,我是四位数存在一个int里面的,当int数为 0 时,输出 0 只有一位数;

  剩下的相信你肯定能找到,2333;

 AC-Code
1
#include <cstdio> 2 using namespace std; 3 typedef long long ll; 4 int num[60][205]={0}; 5 void mul(int *a,int* b,int c){ 6 for(int i=200;i>=0;i--){ 7 b[i]=b[i]+a[i]*c; 8 int cnt=b[i]/10000; 9 b[i]%=10000; 10 for(int j=i-1;cnt&&j>=0;j--){ 11 b[j]=b[j]+cnt; 12 cnt=b[j]/10000; 13 b[j]%=10000; 14 } 15 } 16 } 17 void add(int *a,int *b){ 18 for(int i=200;i>=0;i--){ 19 a[i]+=b[i]; 20 if(a[i]>=10000){ 21 a[i-1]+=a[i]/10000; 22 a[i]%=10000; 23 } 24 } 25 } 26 void init(){ 27 num[0][200]=1; 28 for(int i=1;i<=50;i++){ 29 mul(num[i-1],num[i],i); 30 } 31 for(int i=2;i<=50;i++){ 32 add(num[i],num[i-1]); 33 } 34 } 35 int main(){ 36 ll N; 37 init(); 38 scanf("%lld",&N); 39 int flag=0; 40 for(int i=0;i<=200;i++){ 41 if(num[N][i]&&flag==0){ 42 flag=1; 43 printf("%d",num[N][i]); 44 continue; 45 } 46 if(flag){ 47 if(num[N][i]==0)printf("0000"); 48 else{ 49 if(num[N][i]<10)printf("000%d",num[N][i]); 50 else{ 51 if(num[N][i]<100)printf("00%d",num[N][i]); 52 else{ 53 if(num[N][i]<1000)printf("0%d",num[N][i]); 54 else printf("%d",num[N][i]); 55 } 56 } 57 } 58 } 59 } 60 printf("\n"); 61 return 0; 62 }

 

posted @ 2019-10-31 20:39  流浪AC  阅读(182)  评论(0编辑  收藏  举报