高精度集合

东三省 Accoders题库 多校联训 4776题库答案

①1089高精加

#include<bits/stdc++.h>
using namespace std;
char a[220],b[220];
int c[220];
int main(){
	scanf("%s%s",a+1,b+1);
	int n=strlen(a+1),m=strlen(b+1);
	for(int i=1;i<=n;i++){
		a[i]-='0';
	}
	for(int i=1;i<=m;i++){
		b[i]-='0';
	}
	for(int i=1;i<=max(n,m);i++){
		c[i]=a[n-i+1]+b[m-i+1];
	}
	for(int i=1;i<=max(n,m);i++){
		if(c[i]>=10){
			c[i]-=10;
			c[i+1]++;
		}
	}
	int t=max(n,m)+1;
	if(!c[t])t--;
	for(int i=t;i;i--){
		cout<<c[i];
	}
}

②1810高精减

#include<bits/stdc++.h>
using namespace std;
char a[220],b[220];
int c[220];
int main(){
	scanf("%s%s",a+1,b+1);
	int n=strlen(a+1),m=strlen(b+1);
	for(int i=1;i<=n;i++){
		a[i]-='0';
	}
	for(int i=1;i<=m;i++){
		b[i]-='0';
	}
	for(int i=1;i<=n;i++){
		c[i]=a[n-i+1]-b[m-i+1];
	}
	for(int i=1;i<=max(n,m);i++){
		if(c[i]<0){
			c[i]+=10;
			c[i+1]--;
		}
	}
	int t=n;
	while(!c[t])t--;
	for(int i=t;i;i--){
		cout<<c[i];
	}
}

③1811 2的n次方

#include <iostream>
#include <cstring>
using namespace std;

void timesTwo(char ans[]){
	int len=strlen(ans);
	int tmp[1005]={0};
	int sum[1005]={0};
	for(int i=0;i<len;i++){
		tmp[i]=ans[len-1-i]-'0';
	}
	for(int i=0;i<len;i++){
		sum[i]+=tmp[i]*2;
		sum[i+1]+=(sum[i]/10);
		sum[i]%=10;
	}
	 
	bool flag=false;
	for(int i=len,j=0;i>=0;i--){
		if(sum[i]!=0||i==0){
			flag=true;
		}
		if(flag){
			ans[j++]=sum[i]+'0';
		}
	}
}

int main(){
	char ans[1005]={'1'};
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		timesTwo(ans);
	}	
	cout<<ans;
	return 0;
}

④1812高精乘

#include <stdio.h>
#include <string.h>
void mul(char *a,char *b,char *c){
    int len1=strlen(a),len2=strlen(b);
    int x[201],y[201],z[401];
    int len=len1+len2;
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    memset(z,0,sizeof(z));
    int i,j;
    for (i=len1-1;i>=0;i--)
        x[len1-1-i]=a[i]-'0';
    for (i=len2-1;i>=0;i--)
        y[len2-1-i]=b[i]-'0';
    for (i=0;i<len1;i++){
        for (j=0;j<len2;j++){
           z[i+j]+=x[i]*y[j];
        }
    }
    for (i=0;i<len;i++)
    {
        if (z[i]>=10){
           z[i+1]+=z[i]/10;
           z[i]=z[i]%10;
        }
    }
    while (len>0 && z[len-1]==0) 
        len--;
    if (len==0)  
    {
        c[0]='0';
        c[1]='\0';
        return ;
    }
    for (i=0;i<len;i++)
        c[i]=z[len-1-i]+'0';
    c[len]='\0';
}
int main(){
    char s1[201],s2[201],ans[401];
    scanf("%s%s",s1,s2);
    mul(s1,s2,ans);
    printf("%s\n",ans);
    return 0;
}

⑤1813高精除

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> div(vector <int> &A,int b,int &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数
    vector <int> C; // 答案
    r = 0; // 余数
    for(int i = A.size() - 1;i >= 0;i --){ // 从最高位开始处理
        r = r * 10 + A[i]; // 上一次的余数乘10,再加上当前位上的数,就是被除数
        C.push_back(r / b); // 往C里压入这个被除数除b
        r %= b; // 计算余数
    }
    reverse(C.begin(),C.end()); // 因为除法运算中从高位开始计算,而前导0都在顶部而不是底部,所以要翻转过来
    while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导0
    return C; // 返回答案
}
int main(){
    string a;
    int b;
    cin>>a>>b;
    vector <int> A;
    for(int i = a.size() - 1;i >= 0;i --) A.push_back(a[i] - '0'); // 倒序
    int r;
    auto C = div(A,b,r); // 答案
    for(int i = C.size() - 1;i >= 0;i --) cout<<C[i];
    cout<<endl<<r<<endl;
    return 0;
}

⑤高精度乘低精度(非本课习题)

#include<bits/stdc++.h>
using namespace std;
vector<int>multiply(vector<int>&A,int b){
    vector<int>C;
    int t = 0;
    for(int i = 0; i < A.size(); i ++){
        if(i < A.size())  t += A[i] * b;
        C.push_back(t%10);
        t = t/10;
    }
    while(t){  
        C.push_back(t % 10);
        t /= 10;
    }
    while(C.size() > 1 && C.back() == 0)    C.pop_back();
    return C;
}
int main(){
    string a;
    int b;
    vector <int> A;
    cin >> a >> b;
    for(int i = a.size() - 1;i >= 0;i --) 
        A.push_back(a[i]-'0');
    vector<int>C;
    C = multiply(A,b);
    for(int i = C.size()-1; i >= 0;i --) printf("%d",C[i]);
    return 0;
}

更多习题答案,游戏代码,敬请关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值