/****************************************//*程序 Big Number Multi*//*作者: zzh *//*日期:2007-09-29*//*调试:VC6*//****************************************/
#include<iostream>using namespace std;#define MAX 1000int result[MAX]={0};char a[MAX/2];char b[MAX/2];// s1[lens1]='/0';// s2[lens2]='/0';template<typename Type>void Display(Type s[]){ cout<<s<<endl;}//将字符数组逆序void Reverse(char s[],int length){ char mid[MAX]; for(int i=0;i<length;i++) { mid[length-i-1]=s[i]; } mid[length]='/0'; strcpy(s,mid);}//将result数组调整,因为相乘时没有进位,比如result[i]=35void Schule(int length){ int i=0; for(i=0;i<length;i++) { if(result[i]>=10) { int temp; temp=result[i]; result[i]=temp; result[i+1]+=temp/10; } }}/*相乘,基本思想是:将两个大数存储在字符数组中, 乘数的一位分别乘于被乘数的每一位,将结果保存到result数组中 同时注意对应位的加和进位*/int Multi(char s1[],char s2[],int lens1,int lens2){ int i,j; //char mid[MAX]; for(i=0;i<=lens1-1;i++) { int temp01,temp02,temp03; temp01=s1[i]-'0'; for(j=0;j<=lens2-1;j++) { temp02=s2[j]-'0'; temp03=temp01*temp02; result[i+j]+=temp03; result[i+j+1]+=temp03/10; } } return 0;}void main(){ while(true) { int lens1,lens2,i; cin>>a; lens1=strlen(a); cin>>b; lens2=strlen(b); a[lens1]='/0'; b[lens2]='/0'; Display(a); cout<<endl; Display(b); cout<<endl; Reverse(a,lens1); Display(a); Reverse(b,lens2); Display(b); Multi(a,b,lens1,lens2); Schule(lens1+lens2+1); if(result[lens1+lens2-1]!=0)cout<<result[lens1+lens2-1]; for(i=lens1+lens2-2;i>=0;i--) { cout<<result[i]; } cout<<endl; for(i=0;i<=lens1+lens2+1;i++) result[i]=0; }}
空虚的时候写的,代码很多地方没有优化,可以根据自己的需要做相应的修改!