Product (大数乘法)

题目VJ上的链接:https://vjudge.net/problem/UVA-10106

参考博客:https://www.cnblogs.com/wuqianling/p/5387099.html

思路:1:先把每位的乘的结果得出。2:进位最后统一进。

1:第一位数字的i位和第二位数字的j位相乘得到的一定是在结果的i+j位上(几位是原数字的从右往左开始数,从0开始)

sum[i+j]=a[i]*b[j];

2:简单的进位

 1 #include<stdio.h>
 2 #include<string.h>
 3 char a[1000];
 4 char b[1000];
 5 int a1[1000];
 6 int b1[1000];
 7 int sum[1000*2];
 8 void multiply(char a[],char b[])
 9 {
10     memset(a1,0,sizeof(a1));
11     memset(b1,0,sizeof(b1));
12     memset(sum,0,sizeof(sum));
13     int len=strlen(a);
14     for (int i=0,j=len-1;j>=0;j--)//转化为数组 
15     {
16         a1[i++]=a[j]-'0';
17     }
18     int len1=strlen(b);
19     for (int i=0,j=len1-1;j>=0;j--)//转化为数组 
20     {
21         b1[i++]=b[j]-'0';
22     }
23     for(int i=0;i<len;i++)//1:计算相乘 
24     for (int j=0;j<len1;j++)
25     {
26         sum[i+j]+=a1[i]*b1[j];
27     }
28     for (int i=0;i<len+len1+100;i++)//2:统一进位 
29     {
30         if(sum[i]>=10)
31         {
32             sum[i+1]+=sum[i]/10;
33             sum[i]=sum[i]%10;
34         }
35     }
36     int flag=0;
37     for(int i=len+len1+100;i>=0;i--)//跳过高位0 
38     {
39         if(sum[i]!=0&&flag==0)
40         {
41             flag=1;
42         }
43         if(flag!=0)
44         {
45             flag=i;break;
46         }
47     }
48     for(int i=flag;i>=0;i--)//输出 
49     {
50         printf("%d",sum[i]);
51     }
52     printf("\n");
53 }
54 int main()
55 {
56     while (scanf("%s%s",a,b)!=EOF)
57     {
58         multiply(a,b); 
59     }
60     return 0;
61 }

猜你喜欢

转载自www.cnblogs.com/bendandedaima/p/9361121.html