两个超出int范围的数字相加——c语言
原文链接:https://blog.****.net/huijiaaa1/article/details/79736375
上学期在学校参加一个比赛,今晚偶尔想起上学期比赛出的比较简单的一道题。就晒出来看看。今晚再敲了一边代码 。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;
- }
运行结果:
原文链接:https://blog.****.net/huijiaaa1/article/details/79736375
上学期在学校参加一个比赛,今晚偶尔想起上学期比赛出的比较简单的一道题。就晒出来看看。今晚再敲了一边代码 。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;
- }
运行结果: