上学期在学校参加一个比赛,今晚偶尔想起上学期比赛出的比较简单的一道题。就晒出来看看。今晚再敲了一边代码 。15分钟搞定... 什么...这么简单的我竟然用了十五分钟。。哈哈 当然还要写注释啊 辛苦。。
#include<stdio.h>
#include<string.h>
void fun(char *p,char *s)
{
//首先强调 两个数字加的时候是从后往前加。即字符串从后到前移动...
int a=strlen(p);
int b=strlen(s);
//flag为判断相加后前面的数字是否会大于9的下标...因为大于9就要逐渐往前位进1
int flag=0;
if(a>b)//如果p的数字比s的数字长。。
{
while(b!=0)//当s没有到头的时候 循环一直往前走
{
p[--a]+=s[--b]-48;//把结果存到数字长的那个数组里。 这句代码的意义是:算出相加后的数字的ascii值
flag=a; //flag保持标志位下标最新值
while(p[flag]>'9'&&flag!=0)//如果加了后进位前面数字大于9 一直往前加
{
p[flag]=p[flag]-58+'0'; //数字大于9的话,那么就减去这个差值 。至于为什么减58,因为没有10的ascii码,所以用58代替
p[--flag]+=1;
}
}
}
else
{//如果第二个数字长度大于等于第一个数字
while(a!=0)
{
s[--b]+=p[--a]-48;
flag=b;
while(s[flag]>'9'&&flag!=0)
{
s[flag]=s[flag]-58+'0';
s[--flag]+=1;
}
}//前面这些套路跟上一个一样
for(int c=0;c<(int)strlen(s);c++)//这个for循环时把s指向的数组赋值给p 为什么要这么做?因为最后输出的结果时p数组。
{
p[c]=s[c];
}
p[c]='\0';//千万不要忘记赋结束符了。
}
}
int main(char args[])
{
while(1)
{
char one[20],two[20],*p=one,*s=two;
one[0]=two[0]='0';//考虑到数字要进位,所以把数组第一位都赋值为0
puts("请输入第一个数字:");
scanf("%s",p+1);//从数组的下标为1的地址输入
puts("请输入第二个数字:");
scanf("%s",s+1);
fun(one,two);
puts("相加结果:");
if(one[0]=='0')//如果数组第一位是0,那么说明没有进位,则从下标为1进行输出数组
puts(p+1);
else
puts(p);
}
return 0;
}
运行结果: