高精度运算(模板)

今天课上老师提了提长整数的代数运算,恰巧之前做题也碰到过几次,就顺便写一下吧

最最常用的是加法和乘法,但一家人就要整整齐齐就都整理了吧23333

P1601 A+B Problem(高精)

题目链接

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=510;
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[maxn+10],carry=0;
int main()
{
	scanf("%s%s",a1,b1);
	int len1=strlen(a1),len2=strlen(b1);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	for(int i=0;i<len1;i++)
		a[i]=a1[len1-i-1]-'0';
	for(int i=0;i<len2;i++)
		b[i]=b1[len2-i-1]-'0';
	int len=max(len1,len2);
	for(int i=0;i<len;i++){
		c[i]+=a[i]+b[i]+carry;
		if(c[i]>9){
			carry=1;
			c[i]-=10;
		}
		else
			carry=0;
	}
	if(carry==1){
		c[len++]=1;
	}
	for(int i=len-1;i>=0;i--)
		printf("%d",c[i]);
	printf("\n");
	return 0;
}

P2142 高精度减法

题目链接

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=10090;
char a1[maxn],b1[maxn],tmp[maxn];
int a[maxn],b[maxn],c[maxn];

bool cmp(char x[],char y[]){
	if(strlen(x)!=strlen(y)) return strlen(x)<strlen(y);
	for(int i=0;i<strlen(x);i++){
		if(x[i]!=y[i])
			return x[i]<y[i];
	}
	return false;
}

int main()
{
	scanf("%s%s",a1,b1);
	if(cmp(a1,b1)){
		strcpy(tmp,a1);
		strcpy(a1,b1);
		strcpy(b1,tmp);
		printf("-");
	}	
	int len1=strlen(a1),len2=strlen(b1);
	int len=max(len1,len2);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	for(int i=0;i<len1;i++)
		a[i]=a1[len1-i-1]-'0';
	for(int i=0;i<len2;i++)
		b[i]=b1[len2-i-1]-'0';
	for(int i=0;i<len1||i<len2;i++){
		if(a[i]<b[i]){
			a[i+1]-=1;
			c[i]=a[i]+10-b[i];
		}
		else{
			c[i]=a[i]-b[i];
		}
	}
	while(c[len-1]==0&&len>1)
		len--;		
	for(int i=len-1;i>=0;i--)
		printf("%d",c[i]);
	printf("\n");
	return 0;
}

P1303 A*B Problem(高精)

题目链接

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=2010;
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[2*maxn],len,len1,len2;
int main()
{
	scanf("%s%s",a1,b1);
	len1=strlen(a1),len2=strlen(b1);
	len=len1+len2;
	memset(c,0,sizeof(c));
	for(int i=0;i<len1;++i)
		a[i]=a1[len1-i-1]-'0';
	for(int i=0;i<len2;++i)
		b[i]=b1[len2-i-1]-'0';
	for(int i=0;i<len1;++i){
		for(int j=0;j<len2;j++){
			c[i+j]+=a[i]*b[j];
		}
	}
	for(int i=0;i<len-1;++i){
		if(c[i]>9){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	while(c[len-1]==0&&len>1)
		len--;
	for(int i=len-1;i>=0;--i)
		printf("%d",c[i]);
	printf("\n");
	return 0;
}

高精度除法

除法不怎么常用,懒得写了,贴一个别人的

https://www.cnblogs.com/Hankercat/p/10331701.html

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=1010;
int a[maxn],b[maxn],c[maxn],i;
//输入函数 
void init(int a[]){
    string s;
    cin>>s;
    a[0]=s.length();
    for(i=1;i<=a[0];i++)
        a[i]=s[a[0]-i]-'0';//减法倒序存储 
}
//输出函数
void print(int a[]){
    int i;
    if(a[0]==0){
        cout<<0<<endl;
        return;
    }
    for(i=a[0];i>0;i--)
        cout<<a[i];
    cout<<endl;
    return;  //函数执行完毕回到主程序 
}
//比较函数 
int cmp(int a[],int b[]){
    int i;
     if(a[0]>b[0])  
         return 1;
     if(a[0]<b[0])  
         return-1;
     for(i=a[0];i>0;i--){ //如果两数位数相等,则按位比大小 
         if(a[i]>b[i]) 
             return 1;
          if(a[i]<b[i])
              return -1;  //按位比较若该位数相同,则判断下一位 
     }
    return 0;//如果返回0则表示两数相等 
}
//减法模拟除法 
void sub(int a[],int b[]){
    int flag,i;
    flag=cmp(a,b);
    if(flag==0){
        a[0]=0;
        return;
    }
    if(flag==1){
        for(i=1;i<=a[0];i++){
            if(a[i]<b[i]){
                a[i+1]--;
                a[i]=a[i]+10;
            }
            a[i]-=b[i];
        }
        while(a[0]>0&&a[a[0]]==0)
            a[0]--;
        return;
    }
}
//复制数组 
void numcpy(int p[],int q[],int det){
    for(int i=1;i<=p[0];i++) 
        q[i+det-1]=p[i];
    q[0]=p[0]+det-1;
}
//除法计算 
void div(int a[],int b[],int c[]){
    int i,tmp[maxn];
    c[0]=a[0]-b[0]+1;   //商的位数不超过被除数的位数-除数的位数+1 
    for(i=c[0];i>0;i--){  //每次循环确定某位商的的值,从高位开始 
        memset(tmp,0,sizeof(tmp));
        numcpy(b,tmp,i);
        while(cmp(a,tmp)>=0){
            c[i]++;
            sub(a,tmp);
        }
    }
    while(c[0]>0&&c[c[0]]==0)  
        c[0]--;
    return;
} 
//主函数
int main(){
    init(a);
    init(b);
    div(a,b,c);
    print(c);
    print(a);
    return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值