#include<stdio.h>
#include<string.h>
char a[200]= {0};
char b[200]= {0};
int num1[200]= {0};
int num2[200]= {0};
int ans[200]= {0};//最好要进行初始化。
int main()
{
int num;
int cnt1=0;
int cnt2=0;
int i;
scanf("%s%s",a,b);
int len1=strlen(a);
int len2=strlen(b);
for(i=len1-1; i>=0; i--)
{
num1[cnt1++]=a[i]-'0';
}
for(i=len2-1; i>=0; i--)
{
num2[cnt2++]=b[i]-'0';
}
if(len1>len2)
num=len1;
else
num=len2;
for(i=0; i<num+1; i++)//高精度算法核心部分
{ ans[i+1]+=(num1[i]+num2[i])/10;
ans[i]=(num1[i]+num2[i])%10;
}
for(i=num+1; i>=0; i--)//i=num+1的目的是为了避免因为进位导致的数组格子不够。
{
if(ans[i]!=0)//要想进行输出必须要先找到第一个不为零的而数字。
break;
}
for(; i>=0; i--)
printf("%d",ans[i]);
}
#include<string.h>
char a[200]= {0};
char b[200]= {0};
int num1[200]= {0};
int num2[200]= {0};
int ans[200]= {0};//最好要进行初始化。
int main()
{
int num;
int cnt1=0;
int cnt2=0;
int i;
scanf("%s%s",a,b);
int len1=strlen(a);
int len2=strlen(b);
for(i=len1-1; i>=0; i--)
{
num1[cnt1++]=a[i]-'0';
}
for(i=len2-1; i>=0; i--)
{
num2[cnt2++]=b[i]-'0';
}
if(len1>len2)
num=len1;
else
num=len2;
for(i=0; i<num+1; i++)//高精度算法核心部分
{ ans[i+1]+=(num1[i]+num2[i])/10;
ans[i]=(num1[i]+num2[i])%10;
}
for(i=num+1; i>=0; i--)//i=num+1的目的是为了避免因为进位导致的数组格子不够。
{
if(ans[i]!=0)//要想进行输出必须要先找到第一个不为零的而数字。
break;
}
for(; i>=0; i--)
printf("%d",ans[i]);
}
总的来说 高精度加法分为以下几步
1.存储数字(开char型数组更方便)
2.转化为整形数组存储(涉及ASCII转化),且注意的是,存储过程是逆向存储.
如:
for(i=len2-1; i>=0; i--)
{
num2[cnt2++]=b[i]-'0';
}
为什么要逆向存储?目的在于使后期进位更方便,若正序存储,进位将无法进行。
3.进位时候的算法
很简单,一个ans数组进行存储,进位的条件是位数相加和与9的大小进行比较。
4.由于ans数组开的比较大,那么需要查找逆序第一个不为零的数字,那么这个时候进行一个遍历,那么相加后的数字就可以出来了。