標籤:
2.大數加減
問題描述:
在電腦中,由於處理器位寬限制,只能處理有限精度的十進位整數加減法,比如在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]為符號位。
註:
I、 當輸入為正數時,‘+‘不會出現在輸入字串中;當輸入為負數時,‘-‘會出現在輸入字串中,且一定在輸入字串最左邊位置;
II、輸入字串所有位均代表有效數字,即不存在由‘0‘開始的輸入字串,比如"0012", "-0012"不會出現;
III、要求輸出字串所有位均為有效數字,結果為正或0時‘+‘不出現在輸出字串,結果為負時輸出字串最左邊位置為‘-‘。
樣本
輸入:num1 = "580"
num2 = "-50"
輸出:result = "530"
輸入:num1 = "580"
num2 = "-600"
輸出:result = "-20"
#include <stdio.h>#include <string.h>//【輸入】num1:字串形式運算元1,如果運算元為負,則num1[0]為符號位‘-‘;num2:字串形式運算元2,如果運算元為負,則num2[0]為符號位‘-‘ 【輸出】result:儲存加法計算結果字串,如果結果為負,則result[0]為符號位。 void change(char * str){int num =strlen(str);int i ;int tmp;for(i = 0;i <= (num/2 -1 ); i++){tmp = str[i];str[i] = str[num - i -1];str[num -1 -i] = tmp;} }void jinwei(char *str){int num = strlen(str);if(str[num-1] !=‘-‘){for(int i = 0;i<num;i++ ){if(str[i] >= 0x3a){str[i+1]++;str[i]= str[i] - 10;if(i == num-1){str[i+1] = ‘1‘;}}}}else{for(int i = 0;i<num-1;i++ ){if(str[i] >= 0x3a){str[i+1]++;str[i]= str[i] - 10;if(i == num-2){str[i+1] = ‘1‘;str[i+2] = ‘-‘;}}}}} void jinwei2(char *str){int num = strlen(str);for(int i =0;i<num-1;i++){if(str[i]<0x30){str[i+1]--;str[i]=str[i]+10;}}}void add ( const char *num1,const char *num2, char *result){char num11[50] ="";char num22[50] ="";strcpy(num11,num1);strcpy(num22,num2);change(num11);change(num22);int i1 = strlen(num11);int i2 = strlen(num22);int imin ;int i;int flag;int t;if(num1[0] !=‘-‘ && num2[0] !=‘-‘){i1 >= i2 ? (imin = i2 ) : (imin = i1);//得到加數字中字串較小的 i1 >= i2 ? (flag = 2) : (flag = 1); //標誌位 哪一個是較小的字串 for(i=0;i<imin;i++){result[i] = num11[i] + num22[i] - 0x30;}if(flag == 2)for(;i<i1;i++)result[i] = num11[i];else if(flag == 1)for(;i<i2;i++)result[i] = num22[i];} if(num1[0] ==‘-‘ && num2[0] ==‘-‘){i1 >= i2 ? (imin = i2 ) : (imin = i1);//得到加數字中字串較小的 i1 >= i2 ? (flag = 2) : (flag = 1); //標誌位 哪一個是較小的字串 for(i=0;i<imin-1;i++){result[i] = num11[i] + num22[i] - 0x30;}if(flag == 2)for(;i<i1;i++)result[i] = num11[i];else if(flag == 1)for(;i<i2;i++)result[i] = num22[i];} if(num1[0] !=‘-‘ && num2[0] ==‘-‘){change(num11);change(num22);flag = strcmp(num11,(num22+1));if(flag > 0)//正數大於負數{change(num11);change(num22);for(i =0;i< i1;i++){if(i<i2-1)result[i] = num11[i] - num22[i] + ‘0‘;elseresult[i] = num11[i];} } if(flag < 0)//正數小於負數{change(num11);change(num22);for(i = 0;i<i2;i++){if(i<i1)result[i] = num22[i] - num11[i] + ‘0‘; elseresult[i] = num22[i] ; }} if(flag == 0)result[0] = ‘0‘;}if(num1[0] ==‘-‘ && num2[0] !=‘-‘){change(num11);change(num22);flag = strcmp((num11+1),num22);if(flag > 0)//正數xiao於負數{change(num11);change(num22);for(i = 0;i<i1;i++){if(i<i2)result[i] = num11[i] - num22[i] + ‘0‘; elseresult[i] = num11[i]; }} if(flag < 0)//正數da於負數{change(num11);change(num22);for(i =0;i< i2;i++){if(i<i1-1)result[i] = num22[i] - num11[i] + ‘0‘;elseresult[i] = num22[i] ;} } if(flag == 0)result[0] = ‘0‘;}}void qianyi(char *str){int i =0;for(i = 1;i<strlen(str);i++){str[i-1] = str[i];}}void xianshi(char *str){int i;if(str[0] == ‘-‘)for(i = 1;i<strlen(str);){if(str[i] == ‘0‘){qianyi((str+i));str[strlen(str)-1] = ‘\0‘;}elsebreak ;}elsefor(i = 0;i<strlen(str);i++){if(str[i] == ‘0‘)qianyi((str+i));elsebreak ;}}int main(){char a1[] = "580";char a2[] = "-600";char a3[50] = "";//char a3[] ; add(a1,a2,a3); //change(a1); if(a1[0]!=a2[0]) jinwei2(a3);elsejinwei(a3); change(a3); xianshi(a3);printf("%s",a3);}
華為 題目大資料計算機