51nod这难度过渡也太突兀了……这还是基础题,我真是个弟弟。
题目要求的是能算带符号的加减法,我这个暂时只能算正整数和0的,之后再来写。
#include <stdio.h>
#define MAXLENGTH 10000
int exactAdd(char [],char [],char []);
int main(int argc, char const *argv[])
{
int len;
char a[MAXLENGTH+1],b[MAXLENGTH+1],r[MAXLENGTH+2];
gets(a);gets(b);
len=exactAdd(a,b,r);
for(len--;len>=0;len--)//最终的结果是倒序存储的,需要倒序打印
putchar(r[len]);
return 0;
}
int exactAdd(char a[],char b[],char r[])
{
int i;int carry=0;int bit;//carry标志是否进位,默认为0;bit用于暂时储存每一位对应相加的运算结果(还要加上上一次的进位)
int len_a=strlen(a),len_b=strlen(b);
int len=(len_a>len_b)?len_a:len_b;//len储存两个数中较大的位数
char n1[MAXLENGTH+1]={0},n2[MAXLENGTH+2]={0};//数组n1和n2分别保存a和b的逆序,比如a=1234则n1=4321,注意a的3是'3',而n1的3是ASCII码3
//char数组本身是int数组,这里其实是在用ASCII码保存数字,至于这些数字对应什么字符我们根本不知道
//数字后没有写入\0,如果整个输出会非常长
//不用动态数组是因为需要手动把所有的数初始化为0,比较麻烦
//逆序a,b,以ASCII码储存在n1,n2表中
for(i=0;i<len_a;i++)
n1[i]=a[len_a-1-i]-'0';
for(i=0;i<len_b;i++)
n2[i]=b[len_b-1-i]-'0';
for(i=0;i<len;i++)//把所有的位都算了,因为多余的部分已经初始化为0,所以不影响计算
{
bit=n1[i]+n2[i]+carry;//每一位的运算
if(bit>=10)
{
bit-=10;
carry=1;
}
else
carry=0;
r[i]=bit+'0'; //再还原成字符的0,1,2……
}
return carry==1?len+1:len;//最高位如果发生进位,就要len+1,否则和两数之间较大的那个位数保持一致。
}
void debug_printMemory(char a[],int n)//调试用,无关
{
int i,c=0;
for(i=0;i<n;i++)
{
printf("%3d",a[i]);
c++;
if(c==20)
{putchar('\n');c=0;}
}
}