#include <string> #include <iostream> #include <stdlib.h> #include <map> using namespace std; map <char,int> char2int; map <int,char> int2char; void Init() { for(int i = 0;i<10;i++) { char CData = (char)(i+48); char2int[CData] = i; int2char[i] = CData; } } char * Reverse(const char *strStc,char*strDest) { int nLen = strlen(strStc); int i = 0; for(nLen;0 <= nLen;nLen--) { strDest[i]= strStc[nLen-1]; i++; } strDest[i]='\0'; return strDest; } void add (const char *num1, const char *num2, char *result) { int nLenNum1 = strlen(num1); int nLenNum2 = strlen(num2); char ReverseNum1 [100] ={'0'}; char ReverseNum2 [100] ={'0'}; char ReverseResult [100] = {'0'}; Reverse(num1,ReverseNum1); Reverse(num2,ReverseNum2); int nLen = nLenNum1 > nLenNum2 ? nLenNum1:nLenNum2; for(int i=0;i<nLen;i++) { int nResult = char2int[ReverseNum1[i]] + char2int[ReverseNum2[i]] + char2int[result[i]]; result[i] = int2char[nResult%10]; result[i+1] = int2char[nResult/10]; } strcpy(ReverseResult,result); Reverse(ReverseResult,result); } int main() { Init(); char * num1="9876543210"; char * num2="1234567890"; char result [100] = {'0'}; add(num1,num2,result); cout<<result<<endl; getchar(); return 0; }
2、输入二个64位的十进制数,计算相乘之后的乘积。
答:以下代码为网上别人贴出的,输入任意位数十进制数(包括小数,负数)都可以得出正确结果。
思路是:将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写乘法。
#include <iostream> using namespace std; #define MAX 100 int str_num(char str[]) //计算字符串的长度,等效于strlen(str); { int i=0,num_str=0; while(str[i]!=0) { num_str++; i++; } return num_str; } void place(int num_str,char str[]) //将字符串高低颠倒。 { int temp=0,i=0,j=0; for(i=0,j=num_str-1;i<j;i++,j--) { temp=str[j]; str[j]=str[i]; str[i]=temp; } } void transition(unsigned int a[],char str1[]) //数字字符转化为数字。 { int i=0; while(str1[i]!=0) { a[i]=str1[i]-'0'; i++; } } void multiply_int(unsigned int a[],unsigned int b[],unsigned int c[]) //大数相乘算法,入口为整形数组。 { int i=0,j=0; for(i=0;i<MAX;i++) { for(j=0;j<MAX;j++) { c[i+j]+=a[i]*b[j]; c[i+j+1]+=c[i+j]/10; c[i+j]%=10; } } } void output(int sign,unsigned int c[],int quan) //数据输出。 { int sign_temp=0,i=0; cout<<"The result is: "; if(sign==1) cout<<"-"; for(i=MAX-1;i>-1;i--) { if(sign_temp==0) { if(c[i]!=0) sign_temp=1; } if(sign_temp==1) { if(i==quan-1) cout<<"."; cout<<c[i]; c[i]=0; } } cout<<endl; } void multiply_string(char str1[],char str2[],unsigned int c[]) //大数相乘,入口为字符串。 { unsigned int a[MAX]={0},b[MAX]={0}; int sign=0; transition(a,str1); transition(b,str2); multiply_int(a,b,c); } int sign_comp(char str1[],char str2[]) //符号判断,如果为负数将作相应处理。 { int i=0,sign_num=0; if(str1[0]=='-') { sign_num=!sign_num; for(i=0;i<MAX-1;i++) str1[i]=str1[i+1]; } if(str2[0]=='-') { sign_num=!sign_num; for(i=0;i<MAX-1;i++) str2[i]=str2[i+1]; } return sign_num; } int format(char str[]) //将输入的字符串进行格式化。以得到字符的一些标志信息和相应格式的新数据串。 { int point=0,quan=0,i=0,j,k=0,sign_point=0,num_str=0; num_str=str_num(str); while(str[i]!=0) { if(str[i]<'0'||str[i]>'9') { if(str[i]!='.') { cout<<"data error"<<endl; return(-1); } else { point++; sign_point=i; } } if(point>1) { cout<<"data error"<<endl; return(-1); } i++; } if(point==1) { for(j=sign_point;j<num_str;j++) str[j]=str[j+1]; num_str--; quan=num_str-sign_point; } place(num_str,str); return quan; } void clear(char str[]) //清空函数。 { int i; for(i=0;i<MAX;i++) { str[i]=0; } } void main(void) { char str1[MAX]={0}; char str2[MAX]={0}; int quan1=0; int quan2=0; int sign=0; //0表示结果是整数,1表示结果是负数 unsigned int c[MAX*2+1]={0}; while(true) { cout<<"Please input the first number:"; cin>>str1; cout<<"Please input the second number:"; cin>>str2; sign=sign_comp(str1,str2); quan1=format(str1); quan2=format(str2); if(quan1==-1||quan2==-1) { clear(str1); clear(str2); } if(quan1!=-1 && quan2!=-1 && str1[0]!=0 && str2[0]!=0) break; } multiply_string(str1,str2,c); output(sign,c,quan1+quan2); system("pause"); }