大数乘大数

时间:2022-05-05
本文章向大家介绍大数乘大数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
 1 /*coder @Gxjun*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 #define maxn 10000
 6 char rx[16];   /*既然是实数,那么就精确到16位吧*/
 7 int ans[maxn],nx[17],tem[maxn],cc[maxn];
 8 int main( void )
 9 {
10     int n,i,po=0,j,cnt,k;
11     printf("输入n x的值n");
12     while(~scanf("%d%s",&n,rx))
13     {
14         int pos=strlen(rx)-1,low=0;
15         memset(nx,0,sizeof(nx));
16         po=cnt=0;
17         bool flag=false;   //<判断是否为负数>
18         if(rx[0]=='-'||rx[0]=='+') 
19         {
20             if(rx[0]=='-'&&(n&1))flag=true;
21             low++;
22         }
23         for(i=pos;i>=low;i--)
24         {
25             //小数转化为整数,并记录小数的个数...po;
26             if(rx[i]=='.')   po=pos-i;
27             else  nx[cnt++]=rx[i]-48;   
28         }
29         memset(ans,0,sizeof(ans));
30         memset(tem,0,sizeof(tem));
31         pos=cnt;
32         int len=n*pos,s;
33         po*=n;
34         memcpy(ans,nx,pos*sizeof(nx[0]));
35         while(n-->1)
36         {
37         for(cnt=i=0;i<pos;i++)
38         {
39             for(s=j=0;j<len;j++)
40             {
41                 tem[j]=(ans[j]*nx[i]+s);
42                 s=tem[j]/10;
43                 tem[j]%=10;
44             }
45             /*memcpy(cc,tem,len);*/
46             for(j=cnt,s=k=0 ;j<len;j++,k++)
47             {
48             cc[j]+=(tem[k]+s);
49             s=cc[j]/10;
50             cc[j]%=10;
51             }
52             cnt++;
53             memset(tem,0,sizeof(tem));
54         }
55         memcpy(ans,cc,len*sizeof(cc[0]));
56         memset(cc,0,sizeof(cc));
57     }
58     i=len;
59     while(ans[i]==0&&i>po)i--;
60     if(flag)printf("-");
61      while(i>=0)
62      {
63            printf("%d",ans[i]);
64            if(i==po&&i!=0)printf(".");
65            i--;
66      }
67      putchar(10);
68     }
69     return 0;
70 }