标签:COU 高精度 int sum 大数 len 数组 加法 scanf
首先祝大家新年快乐啊~,今天是2022年的第一天,我给大家看点好康的
大数相加
众所周知,int类型能够存储的数据范围是有限的,最高只能到2^31-1,也就是大约十位数的长度,那我们怎么计算十位以上的数字呢?
就像这样。
相信大家在看到这么一长串的数字的时候就已经想到数组了。 没错,这个就是用数组高精度做的
有以下几个难点:
1、数组怎么输入输出,数组是按什么顺序进行输入的?
2、数组的计算,两个大数长度不一样怎么办?
3、在计算过程中怎么进位?
4、代码的实现也很有难度,总难免有很多小问题。
以下是我的想法:
1、数组主要有两种输入方式:一种是for循环加scanf单个的元素,一般适合小数组的输入;第二种是把原先的数组先用for循环转换为char,然后直接以字符串scanf("%s",arr);输入,非常方便。scanf的输入顺序是从前到后,从数组的第一个元素开始存储。
2、由于scanf把最高位放在数组的最前面,而我们的加法计算要从个位开始,所以我们把数组倒过来存,让个位在最前面,只要个位在最前面对齐,也就解决了我们等下循环相加的俩数长度不同的问题了。
3、关于进位,可以先存一个变量carry=0,循环相加时把carry也加上,用if语句判断前一位的和是否大于10,是则把和数mod10,然后把carry变成1,别忘了carry用完要归0。也可以直接判断,然后计算下一个和数之前把和数加一;我用的是后者。
接下来是我的代码,希望与诸君共勉
#include<stdio.h>
#include<string.h>
#define COU 100
int main()
{
int arr1[COU] = { 0 };
char str1[COU] = { 0 };
scanf("%s", str1);
int arr2[COU] = { 0 };
char str2[COU] = { 0 };
scanf("%s",str2);
int sum[COU+1] = { 0 };
int len1 = strlen(str1);
int len2 = strlen(str2);
int i = 0;
for (i = 0; i < len1; i++)//倒序输入(把str的最后一位放在最前面,即个位在最前面)
{
arr1[i] = str1[len1 - 1 - i]-'0';
}
for (i = 0; i < len2; i++)
{
arr2[i] = str2[len2 - 1 - i] - '0';
}
int len = len1 > len2 ? len1 : len2;//三目语句
for (i = 0; i < len; i++)
{
sum[i] += arr1[i] + arr2[i];//注意进位
if (sum[i] >= 10)
{
sum[i] = sum[i] % 10;
sum[i + 1] += 1;
}
}
if (sum[len] != 0)//去除前导0
{
printf("%d", sum[len]);
}
for (i = len-1; i >=0; i--)//最后再倒序输出
{
if (sum[i] >= 0)
{
printf("%d", sum[i]);
}
}
return 0;
}
最后祝大家新年快乐,2022要天天开心,逢考必过,阖家欢乐!
标签:COU,高精度,int,sum,大数,len,数组,加法,scanf 来源: https://blog.csdn.net/qq_61567032/article/details/122268279
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。