首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

用字符串解决加减乘除解绝不够位

2012-12-27 
用字符串解决加减乘除解决不够位1.在计算机中,由于位宽限制,只能进行有限精度的十进制整数加减法,比如在32

用字符串解决加减乘除解决不够位

1.在计算机中,由于位宽限制,只能进行有限精度的十进制整数加减法,比如在32位宽计算机中,参与运算的操作数和结果必须
在-231~231-1之间。若是需要进行更大规模的十进制整数加法,需要使用特殊的方法实现,比如使用字符串保存操作数和结果,采
纳逐位运算的方式进行。如下:9876543210 + 1234567890 = ?,让字符串 num1="9876543210",字符串 num2="1234567890",结果
保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = ?让字符串 num1="-9876543210",字符串 num2="-
1234567890",终局保存在字符串 result = "-11111111100"。
要求编程实现上述高精度的十进制加法。
要求实现函数:
void add (const char *num1, const char *num2, char *result)
输入:num1:字符串形式操作数1,若是操作数为负,则num1[0]为符号位-
num2:字符串形式操作数2,若是操作数为负,则num2[0]为符号位-
输出:result:保存加法计较终局字符串,若是终局为负,则result[0]为符号位。
当输入为正数时,+不会出今朝输入字符串中;当输入为负数时,-会出今朝输入字符串中,且必然在输入字符串最左边位置
输入字符串所有位均代表有效数字,即不存在由0起头的输入字符串,比如"0012", "-0012"不会呈现;
要求输出字符串所有位均为有效数字,终局为正或0时+不出今朝输出字符串,终局为负时输出字符串最左边位置为-。

#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 100int 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");}

热点排行