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;
    }
  • 相关阅读:
    爬取网页图片
    python 猜数字游戏
    位移运算
    生成随机的名字
    不截半个汉字
    一致性hash的实现
    安装前端脚手架
    什么是快速排序?
    HTML5有趣的标签
    stopPropagation / stopImmediatePropagation
  • 原文地址:https://www.cnblogs.com/shadowwolf/p/12943798.html
Copyright © 2011-2022 走看看