高精度算法
一、高精度加法
1、计算结果的位数
2、将要计算的数字分割成多段,按照顺序排列
3、将两数相加。
4、输出结果。
从高位到低位依次输出。除最高位以外,其他低位上不足4位的要在前面补上0。
核心代码:
int c[100];
//a,b,c都为数组(可用字符数组),分别储存被加数、加数、结果
void add(int a[],int b[])
{
int i=1,x=0;
while((i<=a数组长度)||(i<=b数组的长度))
{
c[i]=a[i]+b[i]+x;//第i位相加并加上次的进位
x=c[i]/10;//向高位进位
c[i]%=10;//储存第i位的值
i++; //位置下标变量
}
}
源代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1010;
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[maxn];
int a1_len,b1_len,lenc,x;
int main()
{
//freopen("file.in","r",stdin);
//freopen("file.out","w",stdout);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1);
gets(b1);//输入加数与被加数
a1_len=strlen(a1);
b1_len=strlen(b1);
for(int i=0;i<=a1_len-1;i++)
a[a1_len-i]=a1[i]-48;//放入a
for(int i=0;i<=b1_len-1;i++)
b[b1_len-i]=b1[i]-48;//放入b
lenc=1;
x=0;
while((lenc<=a1_len)||(lenc<=b1_len))
{
c[lenc]=a[lenc]+b[lenc]+x;//第i位相加并加上次的进位
x=c[lenc]/10;//向高位进位
c[lenc]%=10;//储存第i位的值
lenc++; //位置下标变量+1
}
c[lenc]=x;
if(c[lenc]==0)
lenc--;//最高位
for(int i=lenc;i>=1;i--)
cout<<c[i];//结果
printf("\n");
fclose(stdin);
fclose(stdout);
return 0;
}
二、高精度减法
从键盘读入两个正整数,求他们的差
【分析】:类似加法,可以用竖式求减法
【需要注意的是】;被减数必须比减数大,同时需要处理借位
因此…
源代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1010;
char n1[maxn],n2[maxn],n[maxn];
int a[maxn],b[maxn],c[maxn];
int lena,lenb,lenc,x;
int main()
{
// freopen("file.in","r",stdin);
// freopen("file.out","w",stdout);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int i;
gets(n1);
gets(n2);//输入被减数与减数
if (strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0))
{ //strcmp()为字符串比较函数,如果n1==n2,返回0
//如果n1>n2,返回正整数,如果n1<n2,返回负整数
strcpy(n,n1); //判断被减数和减数的大小,交换减数和被减数
strcpy(n1,n2);
strcpy(n2,n);
cout<<"-"; //交换之后的数据,结果为负数
}
lena=strlen(n1);
lenb=strlen(n2);
for(i=0;i<=lena-1;i++)
a[lena-i]=n1[i]-'0';//放入a
for(i=0;i<=lenb-1;i++)
b[lenb-i]=n2[i]-'0';//放入b
i=1;
while(i<=lena)
{
if(a[i]<b[i])
{
a[i]+=10;//借位
a[i+1]--;//上一位减一
}
c[i]=a[i]-b[i];//对应位相减
i++;
}
i--;
int j;
for(j=i;j>=2;j--)
{
if(c[j]!=0)
break;
}
for(;j>=2;j--)
cout<<c[j];
cout<<c[1];
cout<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
…调减法代码调到天荒地老终于过了
…信竞班还有A+B的题等着我去解决QAQ
…蒟蒻也要努力