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時+不出今朝輸出字符串,終局為負時輸出字符串最左邊位置為-。
[cpp]
#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進制字符數組進行表示,然後模擬人們手工進行“豎式計算”的過程編寫乘法。
[cpp]
#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");
}