UVA - 10106-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=i;break;
42 }
43 }
44 for(int i=flag;i>=0;i--)//输出
45 {
46 printf("%d",sum[i]);
47 }
48 printf("\n");
49 }
50 int main()
51 {
52 while (scanf("%s%s",a,b)!=EOF)
53 {
54 multiply(a,b);
55 }
56 return 0;
57 }