高精度(困难)

1.幂次方

#include<iostream>

#include<string>
using namespace std;

int a[1007]={1}; 
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=1000;j++){
			a[j]*=m;
            //需要单独处理进位,把进位调到这里有问题
            //进位在下面:2^4=16;进位在这:2^4=26
            
		}
		for(int j=0;j<=1000;j++){
			//进位
			a[j+1]=a[j+1]+a[j]/10;
			a[j]%=10;
			
		}
	}
	int ptr=0;//指针,标记输出位置
	for(int i=1000;i>=0;i--){//倒序找出,倒序输出,列表:4 0 2 1,输出:1024
		if(a[i]>0){
			ptr=1;//找到了(不是0的时候,也能用a[i]!=0)
		}
		if(ptr==1){//如果找到,倒序输出
			cout<<a[i];
		}
	}
	return 0;
}

2.mod(先除,在乘,最后减)

5mod 3,先除,[5/3]=1(向下取整)1*3=3,  5-3=2,利用向下取整的特性,就能MOD了(高%低精度)

#include<bits/stdc++.h>
using namespace std;
int divide(int *a,int b,int *c,int *r,int len){
    int lenc=len-1;
    *r=0;
    while(lenc>=0){
        int d=(*r)*10+a[lenc];
        c[lenc]=d/b;
        *r=d%b;
        lenc--;
    }
    for(lenc=len-1;lenc>=0;lenc--){
        if(c[lenc]!=0)break;
    }
    return ++lenc;
}
int main(){
    int defsum=0;
    const int N=100010;
    int a[N],b,c[N],r;
    string def;
    int defi=0;
    memset(a,0,sizeof(a));memset(c,0,sizeof(c));
    string opa;
    cin>>opa>>b;
    b=b;
    int lena=opa.size();;
    for(int i=lena-1;i>=0;i--)a[lena-i-1]=opa[i]-'0';
    int lenc=divide(a,b,c,&r,lena);
    for(int i=lenc-1;i>=0;i--){
        cout<<c[i];
        def+=c[i]+'0';
        //defi++;
    }
    cout<<endl;
    string s=def;
	int n=b;
	for(int i=0;i<lena;i++)a[i]=0;
	int x=0;
    int b1[1005];
	int len=s.size();
	for(int i=0;i<len;i++){
		a[i]=s[len-1-i]-'0';
	}

	for(int i=0;i<len;i++){
		a[i]=(a[i]*n)+x;
		x=a[i]/10;
		
		a[i]%=10;
		if(i==len-1&&x>0){
			len++;
		}
	}
//	int l=lena+lenb;
//	while(c[l-1]==0&&l>1){
//		l--;
//	}
	string str2;
	for(int i=len-1;i>=0;i--){
       //cout<<a[i];
        str2+=a[i]+'0';
    }
    for(int i=0;i<lena;i++){
        a[i]=0;
        
    }
    for(int i=0;i<lenc;i++){
        c[i]=0;
    }
	string s1=opa,s2=str2;
	
	int lena1=s1.size();
	for(int i=0;i<lena1;i++){
		a[i]=s1[lena-i-1]-'0';
	}
	int lenb1=s2.size();
	for(int i=0;i<lenb1;i++){
		b1[i]=s2[lenb1-i-1]-'0';
	}
	int len1=max(lena1,lenb1);
	for(int i=0;i<len1;i++){
		c[i]+=a[i]-b1[i];
		if(c[i]<0){
			c[i+1]--;
			c[i]+=10;
		}
	}
	while(c[len1-1]==0&&len1>1){
		len1--;
	}
	for(int i=len1-1;i>=0;i--){
		cout<<c[i];
	}
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值