大数相乘

大数相乘的实现,在这里,采用最直接的实现方法:类似于手工计算,逐位相乘。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 //反转字符,使其符合数组低位为数字低位
 6 void reverseNum(char* s1)
 7 {
 8     int i=0;
 9     int j=strlen(s1)-1;
10     while(i<j)
11     {
12         char temp=s1[i];
13         s1[i]=s1[j];
14         s1[j]=temp;
15         ++i;
16         --j;
17     }
18 }
19 
20 //输入两个数字字符串,进行相乘,并返回结果字符串
21 char* BigNumMultiple(char* s1,char* s2)
22 {
23     //反转数字
24     reverseNum(s1);
25     reverseNum(s2);
26 
27     int temp1,temp2,addFlag,multiFlag;
28     int len1=strlen(s1);
29     int len2=strlen(s2);
30     temp1=temp2=0;
31 
32     char* result=new char[len1+len2+1];
33     memset(result,48,len1+len2);
34     result[len1+len2]='';
35 
36     //相乘
37     for(int i=0;i<=len1-1;i++)
38     {
39         multiFlag=0;
40         addFlag=0;
41         for(int j=0;j<=len2-1;j++)
42         {
43             temp1=(s1[i]-'0')*(s2[j]-'0')+multiFlag;
44             multiFlag=temp1/10;
45             temp1=temp1%10;
46             temp2=(result[i+j]-'0')+temp1+addFlag;
47             result[i+j]=temp2%10+'0';
48             addFlag=temp2/10;
49         }
50         result[i+len2]+=multiFlag+addFlag;
51     }
52 
53     //去除高位多余的0
54     int n=strlen(result)-1;
55     while(result[n]=='0')
56     {
57         //确保结果为0的时候不会把最后一个0清空掉
58         if(n==0)
59             break;
60         result[n]='';
61         n--;
62     }
63     
64     //恢复数字的字符串显示
65     reverseNum(s1);
66     reverseNum(s2);
67     reverseNum(result);
68 
69     return result;
70 }
71 
72 //简单测试
73 int main()
74 {
75 while(true)
76 {
77     char* left=new char[100];
78     char* right=new char[100];
79     char* str;
80     cin.getline(left,100);
81     cin.getline(right,100);
82     str=BigNumMultiple(left,right);
83     cout<<left<<"*"<<right<<"=
"<<str<<endl;
84     system("pause");
85 }
86 }
原文地址:https://www.cnblogs.com/lsr-flying/p/4741106.html