我们都知道无论是int还是double或者是long long都有它可以表示的数据的范围
如果有下面这道题:
111111111111111111111111+222222222222222222222222=?
你会怎么解答呢~~(手动狗头)~~
- 首先,它肯定超出了long long的范围,不能定义为普通的数据类型,那如何储存这个数据呢 灵光一闪,数组好像可以!
- 不过数组的输入得是这样的: 1 空格 1 空格… 可是如果是两个数相加的话是不能有空格的,那有没有可以连续输入的数组呢
- 字符数组!
那要将字符转化为数字再相加,还要考虑进位等问题
思路大致如上图,接下来放代码再详细讲解
#include<stdio.h>
#include<string.h>
int main(void)
{
int a[10000]={
0},b[10000]={
0},c[10000]={
0},la,lb,lc,i;
char s1[10000],s2[10000];
scanf("%s",s1);
scanf("%s",s2);
la=strlen(s1);
lb=strlen(s2);
for(i=0;i<la;i++){
a[la-i]=s1[i]-'0';
}
for(i=0;i<lb;i++){
b[lb-i]=s2[i]-'0';
}
if(la>lb){
lc=la;
}else{
lc=lb;
}
for(i=0;i<=lc;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[lc]==0&&lc>0){
lc--;
}
for(i=lc;i>0;i--){
printf("%d",c[i]);
}
return 0;
}
详细讲解如下:
#include<stdio.h>
#include<string.h>
int main(void)
{
int a[10000]={
0},b[10000]={
0},c[10000]={
0},la,lb,lc,i;
char s1[10000],s2[10000];
scanf("%s",s1);
scanf("%s",s2);
la=strlen(s1);
//s1的长度
lb=strlen(s2);
//s2的长度
for(i=0;i<la;i++){
a[la-i]=s1[i]-'0';
//将字符数组里的'1'转化数字1并存到int型数组的最后一位
//注意,是从最后一位存起,主要是因为相加,如111+22,最后一位最先相加
//如果是123+45,是先计算3+5,然后2+4
//在代码里就存成321和54
//这样a[0]+b[0]就是3+5!
}
for(i=0;i<lb;i++){
b[lb-i]=s2[i]-'0';
}
if(la>lb){
lc=la;
}else{
lc=lb;
}//寻找到数组最长的长度
for(i=0;i<=lc;i++){
c[i]+=a[i]+b[i];
//+=的原因是可能会有前一位进位的情况
c[i+1]=c[i]/10;//考虑进位
c[i]%=10;
}
if(c[lc]==0&&lc>0){
lc--;//删除前导0
}
for(i=lc;i>0;i--){
printf("%d",c[i]);//逆序打印
}
return 0;
}
OK,完结撒花 !!!