C++从入门到入土-高精度加法

高精度算法

一、高精度加法

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;
}

二、高精度减法

从键盘读入两个正整数,求他们的差

【分析】:类似加法,可以用竖式求减法

【需要注意的是】;被减数必须比减数大,同时需要处理借位

扫描二维码关注公众号,回复: 775213 查看本文章

因此…

代码:

#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

…蒟蒻也要努力

猜你喜欢

转载自blog.csdn.net/qq_41993986/article/details/79933328