标签:
大数相乘的实现,在这里,采用最直接的实现方法:类似于手工计算,逐位相乘。
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]=‘\0‘; 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]=‘\0‘; 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<<"=\n"<<str<<endl; 84 system("pause"); 85 } 86 }
标签:
原文地址:http://www.cnblogs.com/lsr-flying/p/4741106.html