如果给你两个超出int范围的数字相加你会怎么做?

上学期在学校参加一个比赛,今晚偶尔想起上学期比赛出的比较简单的一道题。就晒出来看看。今晚再敲了一边代码 。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;

}


运行结果:


猜你喜欢

转载自blog.csdn.net/huijiaaa1/article/details/79736375