#include <stdio.h> #include <string.h>
int main() { char num_1[102], num_2[102], result[102]; //处理100位数,增加两位分别作符号位和最后一位'\0'
scanf("%s %s", num_1, num_2);
int start_1 = 0, start_2 = 0, start_r = 0; //最高位下标
int len_1=0, len_2=0; //位数
bool sign_1=true, sign_2=true; //符号位,正数为真,负数为假
num_1[0] == '-' ? sign_1 = false, len_1 = strlen(num_1)-1, start_1 = 1 : len_1 = strlen(num_1); num_2[0] == '-' ? sign_2 = false, len_2 = strlen(num_2)-1, start_2 = 1 : len_2 = strlen(num_2);
int index_1 = start_1, index_2 = start_2; //计算时的下标索引,初始时指向最高位
int compare = 0; //两数绝对值比较结果,0——相等,-1——小于,1——大于
int i = 0; if (len_1 == len_2) //长度相等
{ for( ; i < len_1; i++) //按位比较大小
{ if(num_1[index_1] > num_2[index_2]) { compare = 1; break; } else if(num_1[index_1] < num_2[index_2]) { compare = -1; break; } else compare = 0;
index_1++; index_2++; } } else //长度不等
len_1 > len_2 ? compare = 1 : compare = -1;
bool isBeyond = false; //进位或借位标识
if (sign_1 == sign_2) //同号
{ index_1 = start_1 + len_1 -1; index_2 = start_2 + len_2 -1;
switch(compare) { case -1:
case 0: //被减数绝对值小于等于减数
for( ; index_1 >= start_1; index_1--, index_2-- ) { result[index_2] = num_2[index_2] - num_1[index_1] + '0'; if(isBeyond) //如果小一位有借位
result[index_2]--; if(result[index_2] < '0') { isBeyond = true; result[index_2] += 10; } else isBeyond = false; } while(index_2 >= start_2) { if(isBeyond) result[index_2] = num_2[index_2] - 1; else result[index_2] = num_2[index_2]; if(result[index_2] < '0') { isBeyond = true; result[index_2] = '9'; } else isBeyond = false;
index_2--; }
result[start_2 + len_2] = '\0'; //字符串结束字符
if(sign_1) //如果被减数为正,则减数为正,结果为负
{ //格式字符串,result[0]='-'
for( i = 0; i < start_2 + len_2; i++) if(result[i] != '0') { start_r = i; break; } if(start_r > 1) for( i = start_r; i <= start_2 + len_2; i++) result[i - start_r + 1] = result[i]; else if(start_r == 0) for( i = start_2 + len_2; i >= start_r; i--) result[i - start_r + 1] = result[i]; result[0] = '-'; } else //如果被减数为负,则减数为负,结果为正
{ //格式字符串
for( i = 1; i < start_2 + len_2; i++ ) if(result[i] != '0') { start_r = i; break; } for( i = start_r; i <= start_2 + len_2; i++) result[i - start_r] = result[i]; } break;
case 1: for( ; index_2 >= start_2; index_1--, index_2-- ) { result[index_1] = num_1[index_1] - num_2[index_2] + '0'; if(isBeyond) //如果小一位有借位
result[index_1]--; if(result[index_1] < '0') { isBeyond = true; result[index_1] += 10; } else isBeyond = false; } while(index_1 >= start_1) { if(isBeyond) result[index_1] = num_1[index_1] - 1; else result[index_1] = num_1[index_1]; if(result[index_1] < '0') { isBeyond = true; result[index_1] = '9'; } else isBeyond = false;
index_1--; }
result[start_1 + len_1] = '\0'; //字符串结束字符
if(sign_1) //如果被减数为正,则减数为正,结果为正
{ //格式字符串
for( i = 0; i < start_1 + len_1; i++) if(result[i] != '0') { start_r = i; break; } for( i = start_r; i <= start_1 + len_1; i++) result[i - start_r] = result[i]; } else //如果被减数为负,则减数为负,结果为负
{ //格式字符串,result[0]='-'
for( i = 1; i < start_1 + len_1; i++) if(result[i] != '0') { start_r = i; break; } for( i = start_r; i <= start_1 + len_1; i++) result[i - start_r + 1] = result[i]; result[0] = '-'; } break;
default: break; } } else //异号
{ index_1 = start_1 + len_1 -1; index_2 = start_2 + len_2 -1;
switch(compare) { case -1:
case 0: //被减数绝对值小于等于减数
for( ; index_1 >= start_1; index_1--, index_2-- ) { result[index_2] = num_1[index_1] + num_2[index_2] - '0'; if(isBeyond) //如果小一位有进位
result[index_2]++; if(result[index_2] > '9') { isBeyond = true; result[index_2] -= 10; } else isBeyond = false; } while(index_2 >= start_2) { if(isBeyond) result[index_2] = num_2[index_2] + 1; else result[index_2] = num_2[index_2]; if(result[index_2] > '9') { isBeyond = true; result[index_2] = '0'; } else isBeyond = false;
index_2--; }
result[start_2 + len_2] = '\0'; //字符串结束字符
if(sign_1) //如果被减数为正,则减数为负,结果为正
{ if(isBeyond) //最高位进位
{ result[0] = '1'; } else //最高位不进位,result中所有元素前移1位
for( i = 1; result[i-1] != '\0'; i++) { result[i-1] = result[i]; } } else //如果被减数为负,则减数为正,结果为负
{ if(isBeyond) //最高位进位,result中所有元素后移2位,result[0]='-',result[1]='1'
{ for( i = start_2 + len_2; i >= start_2; i--) { result[i+2] = result[i]; } result[1] = '1'; } else //最高位不进位,result中所有元素后移1位,result[0]='-'
for( i = start_2 + len_2; i >= start_2; i--) result[i+1] = result[i]; result[0] = '-'; } break;
case 1: //被减数绝对值大于减数
for( ; index_2 >= start_2; index_1--, index_2-- ) { result[index_1] = num_1[index_1] + num_2[index_2] - '0'; if(isBeyond) //如果小一位有进位
result[index_1]++; if(result[index_1] > '9') { isBeyond = true; result[index_1] -= 10; } else isBeyond = false; } while(index_1 >= start_1) { if(isBeyond) result[index_1] = num_1[index_1] + 1; else result[index_1] = num_1[index_1]; if(result[index_1] > '9') { isBeyond = true; result[index_1] = '0'; } else isBeyond = false;
index_1--; }
result[start_1 + len_1] = '\0'; //字符串结束字符
if(sign_1) //如果被减数为正,则减数为负,结果为正
{ if(isBeyond) //最高位进位,result中所有元素后移1位,result[0]='1'
{ for( i = start_1 + len_1; i >= start_1; i--) { result[i+1] = result[i]; } result[0] = '1'; } else //最高位不进位,什么也不做
NULL; } else //如果被减数为负,则减数为正,结果为负
{ if(isBeyond) //最高位进位,result中所有元素后移2位,result[0]='-',result[1]='1'
{ for( i = start_1 + len_1; i >= start_1; i--) { result[i+2] = result[i]; } result[1] = '1'; } else //最高位不进位,result[0]='-'
NULL; result[0] = '-'; } break;
default: break; } } printf("%s\n", result);
return 0; }
|