C语言实现大数相加的代码问题
程序员文章站
2022-04-28 08:57:21
...
C语言中的大数相加问题
一.为什么会出现大数相加的问题
- C语言是面向过程的一门语言,它并不像java一般拥有众多方便的方法,因此大多数的代码都要依靠程序员本身进行实现。此篇便是针对C语言无法实现大数相加进行书写的(不喜勿喷),int longlonglong~unsigned long long 均有对应的数据长度上限,因此便有了大数相加的问题。
二.大数相加所要掌握的知识
本代码涉及数组,及字符串的一些基本函数,基本的c语言的一些语句。
函数的定义方法(掌握或不掌握均可以)。
三.大数相加的思路
- 使用字符串进行大数的储存。
char str1[numb],str2[numb];
scanf("%s%s",&str1,&str2);
2.引入三个数组作为字符串转为数字的容器,和最终计算结果的容器(可适当的根据位数设定数组大小),并引入变量计算字符串的长度(即大数的位数)。
int numb1[numb]={0},numb2[numb]={0},numb3[numb]={0};//numb即为定义的数组大小,并对其进行初始化
int leg1,leg2,leg3;
leg1=strlen(str1);//利用c中本身的函数计算字符串的长度
leg2=strlen(str2);
3.将字符串转为数字类型存入数组类型,此处需要明白利用ASCII码将字符转为数字的原因(此处不再解释)
for(int i=leg1-1,j=0; i>=0;i--,j++) {
numb1[j]=str1[i]-'0';
}
for(int i=leg2-1,j=0; i>=0;i--,j++) { //倒叙储存的原因是为了此后进行计算方便,进行更易的进位。
numb2[j]=str2[i]-'0';
}
假如大数为123456789
987654321
储存的方式如图所示
例图
4.便为最关键的进位问题,10进制数满10进一,因此在每一次进行对应数组位相加(引入临时变量temp)时便要考虑进位问题(此处我采用的是for循环),将相加的结果放入数组三。话不多说上代码。
for(int i=0;i<max(leg1,leg2);i++){//判断需要进行加法的位数
int temp;
temp=numb1[i]+numb2[i];
if(temp>=10){
numb3[i]+=temp-10;
numb3[i+1]++;
}
else{
numb3[i]=temp;
}
}
5.最后一步便是最终结果的输出,因为相加后的结果是倒叙,只需将结果倒叙输出就可实现,(但需考虑大数最高位的进位问题,小编运用了数组的性质(即在未赋值的地方位’\0’)进行判断),而后进行了输出
for(leg3=0;numb3[leg3]!='\0';leg3++){
}
for(int i=leg3-1;i>=0;i--){
printf("%d",numb3[i]);
}
}
四.整理代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define numb 10000
void main()
{
int max(int a, int b);
int leg1, leg2, leg3;
char str1[numb], str2[numb];
int numb1[numb] = { 0 }, numb2[numb] = { 0 }, numb3[numb] = {0};
scanf("%s%s", &str1, &str2);
leg1 = strlen(str1);
leg2 = strlen(str2);
for (int i = leg1 - 1, j = 0; i >= 0; i--, j++) {
numb1[j] = str1[i] - '0';
}
for (int i = leg2 - 1, j = 0; i >= 0; i--, j++) {
numb2[j] = str2[i] - '0';
}
for (int i = 0; i < max(leg1, leg2); i++) {
int temp;
temp = numb1[i] + numb2[i];
if (temp >= 10) {
numb3[i] += temp - 10;
numb3[i + 1]++;
}
else {
numb3[i] = temp;
}
}
for (leg3 = 0; numb3[leg3] != '\0'; leg3++) {
}
for (int i = leg3 - 1; i >= 0; i--) {
printf("%d", numb3[i]);
}
}
int max(int a, int b) {
return a>b?a:b;
}
五.运行实例
第一次写博客,还请诸位多多关照。