注意:
这只是100位数(十进制)以内的正整数的加法
目录
我终于在今天写出来了o(*≧▽≦)ツ┏━━┓
法一
#include <stdio.h>
#include<string.h>
int main(){
//定义变量、初始化
char a[101],b[101];
int c[101]={0};
for(int i=0;i<101;i++){a[i]='0';b[i]='0';}
//输入大数、判断长度
scanf("%s %s",a,b);
int long_a=strlen(a);
int long_b=strlen(b);
int long_max=long_a>long_b?long_a:long_b;
int long_min=long_a>long_b?long_b:long_a;
//倒过来
strrev(a);strrev(b);
//printf("%s %s\n",a,b);
for(int i=0;i<long_max;i++){
c[i]+=((int)a[i]-48)+((int)b[i]-48);
if(i==long_min)c[i]+=48;
}
//定义输出数组(已完成两次颠倒),初始化
int output[long_max];
for(int i=0;i<long_max;i++){
output[i]=0;
}
for(int i=0;i<long_max;i++){
output[long_max-i-1]=c[i];
}
//进位问题
for(int i=long_max-1;i>0;i--){
if(output[i]>=10){
output[i-1]+=1;
output[i]=output[i]%10;
}
}
printf("\n");
for(int i=0;i<long_max;i++){
printf("%d",output[i]);
}
return 0;
}
写出来后发现
Σ(っ °Д °;)っ
找了半天原因,发现是不能用 strrev( );
这个我也不太清楚,大概是我刷题的平台的 string.h 库里没有这个函数吧,
了解情况后,我决定通过循环实现 strrev() 函数的功能。
法二
#include <stdio.h>
#include<string.h>
int main(){
//定义变量、初始化
char x[101],y[101],a[101],b[101];
int c[101]={0};
for(int i=0;i<101;i++){x[i]='0';y[i]='0';a[i]='0';b[i]='0';}
//输入大数、判断长度
scanf("%s %s",x,y);
int long_a=strlen(x);
int long_b=strlen(y);
int long_max=long_a>long_b?long_a:long_b;
int long_min=long_a>long_b?long_b:long_a;
//倒过来
for(int i=0;i<=long_a;i++){
a[i]=x[long_a-i-1];
}
for(int i=0;i<=long_b;i++){
b[i]=y[long_b-i-1];
}
//字符变整型
for(int i=0;i<long_max;i++){
c[i]+=((int)a[i]-48)+((int)b[i]-48);
if(i==long_min)c[i]+=48;
}
//定义输出数组(已完成两次颠倒),初始化
int output[long_max];
for(int i=0;i<long_max;i++){
output[i]=0;
}
for(int i=0;i<long_max;i++){
output[long_max-i-1]=c[i];
}
//进位问题
for(int i=long_max-1;i>0;i--){
if(output[i]>=10){
output[i-1]+=1;
output[i]=output[i]%10;
}
}
//输出
for(int i=0;i<long_max;i++){
printf("%d",output[i]);
}
return 0;
}
这道题困惑了我好几天,ac时真的非常激动,以后掌握的牢了会来简化代码
感觉有点水,好了,正文开始
一、为什么不能简单的A+B
在C语言中,每个数据类型都是有表示范围的,这个我以后会写一篇细讲
目前,表示正整数范围最大的数据类型是 unsigned long long (int),
表示范围是 0~4294967295 即 0~( -1),
也就是说只用基本数据类型,十位数的运算就是到极限了,
这时,想要进行大数运算,就要另寻他法了。
二、大数加法的原理
其实,就是我们小学学的列式法,一位一位的加,大于十就进位。
篇尾
我也是初学者,知识限制,代码比较笨,网上大数加法代码多着是,我提供的只是一种的思路。