大数乘大数

 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 }

 

你可能感兴趣的:(大数乘大数)