zoukankan      html  css  js  c++  java
  • [C++]超高位数的高精度算法-加法 用于完美(划掉)解决爆内存问题

    高精度加法

    原理:

    将数字分成数组存入,逐位相加

    原来int的要开很大的,如10000000000000000,或者有些long long都不够,在char里面只要17位

    Q:为什么?

    A:因为原来是将一个数存入,现在分成字符存入数组,进行加法运算

    首先将读入的字符存入int数组

    读入数据1:

    
    	for(int i=1;i<=a[0];i++){
    		a[i]=a1[a[0]-i]-'0';
    	}
    

    读入数据2:

    
    	for(int j=1;j<=b[0];j++){
    		b[j]=b1[b[0]-j]-'0';
    	}
    	

    读入之后

    c数组负责加法运算

    lenc是c的长度

    x是进位的多少,如果这个数小于10,除以10是0

    都懂吧?

    	while(lenc<=e){
    	
    		c[lenc]=a[lenc]+b[lenc]+x;
    			x=c[lenc]/10;
    			c[lenc]%=10;
    			lenc++;
    		
    		
    }

    然后输出: 

    	for(int i=lenc;i>=1;i--){
    	printf("%d",c[i]);
    	}

    整段代码:

    #include<cstdio>
    #include<string>
    using namespace std;
    	char a1[100],b1[100];
    int a[100],b[100],c[100],x=0,e,lenc=1;
    int maxaaa(int a,int b){
    	if(a>b){
    		return a;
    	}else return b;
    }
    int main(){
    	
    	gets(a1);
    	gets(b1);
    	a[0]=strlen(a1);
    	b[0]=strlen(b1);
    	e=maxaaa(a[0],b[0]);
    	for(int i=1;i<=a[0];i++){
    		a[i]=a1[a[0]-i]-'0';
    	}
    	for(int j=1;j<=b[0];j++){
    		b[j]=b1[b[0]-j]-'0';
    	}
    	while(lenc<=e){
    	
    		c[lenc]=a[lenc]+b[lenc]+x;
    			x=c[lenc]/10;
    			c[lenc]%=10;
    			lenc++;
    		
    		
    }
    if(c[lenc]==0){
    	lenc--;
    }
    
    	for(int i=lenc;i>=1;i--){
    	printf("%d",c[i]);
    	}
    	
    	
    	return 0;
    }
  • 相关阅读:
    Kali Linux软件更新日报20190622
    Maltego更新到4.2.4.12374
    Kali Linux又增加一个顶级域名kali.download
    Nessus提示API Disabled错误
    数据包分析中Drop和iDrop的区别
    快速识别Hash加密方式hashid
    识别哈希算法类型hash-identifier
    vue实现前端导出excel表格
    vue自动化单元测试
    Mock制作假数据
  • 原文地址:https://www.cnblogs.com/shadowwolf/p/12943798.html
Copyright © 2011-2022 走看看