C语言大数加法学习/复习

大数加法

为什么C语言会有大数加法这个专门的概念?

难道大数不是直接相加就行了吗?

其实是因为C语言中定义的整数型都是有位数限制的。比如int型的取值范围为-2147483648~+2147483647,即使是long long int的取值范围也只是-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807。

这样就导致如果数字超过这个范围就会出错,因此才有大数加法这个概念。

为了解决数字相加过大导致的错误,我们在计算大数相加的时候不使用整数型来进行计算。而是使用字符串数组来进行计算!

完整代码如下:

初学的时候看起可能会有点难度,但是坚持下去就会有很大的收获。

#include<stdio.h>
#include<string.h>
#define N 10000//定义数组的长度,这个长度要大于结果的长度
int main()
{
    
    
    char sz_1[N]={
    
    0},sz_2[N]={
    
    0},sz[N]={
    
    0};//初始化
    int n,m,z;
    int i;
    printf("请输入第一个数\n");
	gets(sz_1);
	printf("请输入第二个数\n");
	gets(sz_2);
	n=strlen(sz_1);//计算开始的时候两数的长度
	m=strlen(sz_2);
	z=n>m?n:m;//
	z++;//这里的z++是为了防止结果进位导致不够
	for(i=0;i<n&&i<m;i++)
    {
    
        //从最后面的数加起,因为最后面的数是最小位
        sz[z-1-i]=sz_1[n-i-1]-'0'+sz_2[m-1-i]-'0';//这里减去'0'才是其真正的数字
    }
    if(n>m)//下面把大的位直接放到数组里
    {
    
    
        for(;i<n;i++)
        {
    
    
            sz[z-1-i]=sz_1[n-i-1]-'0';
        }
    }
    else
    {
    
    
      for(;i<m;i++)
      {
    
    
          sz[z-1-i]=sz_2[m-i-1]-'0';
      }
    }
    for(i=z-1;i>0;i--)
    {
    
    
        if(sz[i]>=10)
        {
    
    
            sz[i]=sz[i]%10;//大于10的数要进位
            sz[i-1]++;
        }
    }
    if(sz[0]!=0)
    {
    
    
        for(i=0;i<z;i++)
        {
    
    
            sz[i]+='0';//这里与上面对应,加了'0'才是ASCLL码对应的数字
        }
        sz[z]='\0';
    }
    else
    {
    
    
        for(i=1;i<z;i++)
        {
    
    
            sz[i-1]=sz[i]+'0';
        }
        sz[z-1]='\0';
    }
    printf("两数相加:\n");
    puts(sz);//输出结果验证
    return 0;
}

代码运行结果如下:
在这里插入图片描述

总结:大数加法看上去有点难度,但是其实很简单,只需要你认真看完!

个人心得:兴趣与成就感是我们进步的最大动力!希望可以写自己复习看起舒适,别人一下子就可以看懂的博客。

猜你喜欢

转载自blog.csdn.net/qq_52988578/article/details/115049106
今日推荐