• 精度计算——加法


    精度计算——加法

    语法:add(char a[],char b[],char s[]);

    参数:

    a[]:被加数,用字符串表示,位数不限

    b[]:加数,用字符串表示,位数不限

    s[]:结果,用字符串表示

    返回值:null

    注意:

    • 空间复杂度为 o(n^2)

    • 需要 string.h

    源程序:

    void add(char a[], char b[], char ans[])
    {
    	int len = (strlen(a)>strlen(b)? strlen(a):strlen(b))+2;
    	char *c = new char[len];   //用来存结果
    
    	int k=0;
    	int up=0;	//进位
    	int x,y,z;
    	for(int i=strlen(a)-1,j=strlen(b)-1; i>=0||j>=0; i--,j--)
    	{//2个索引分别指向字符串的最后一位,只要其中一个索引大于0,就向前遍历
    		x = i>=0 ? a[i]:'0';
    		y = j>=0 ? b[j]:'0';
    		z = x-'0'+y-'0'+up;
    		if(z>9)	{up=1; z%=10;}
    		else	up=0;
    		c[k++] = z+'0';   //还原成数字,妙啊!!    
    	}
    	if(up)	c[k++] = '1';	//如果最高位有进位
    
    	int cnt;
    	for(cnt=0; cnt<k; cnt++)	//倒置字符串
    		ans[cnt] = c[k-cnt-1];
    	ans[cnt] = '';	//加上结束符
    }
    

    自己的做法:(空间用多啦)

    void add(char a[],char b[], char s[]){
    	int alen=strlen(a);
    	int blen=strlen(b);
    	char str1[100];
    	char str2[100];
    	char ans[100];
    
    	//注意这里是给每个字节初始化为整数0,,而不是字符'0'
    	//因为下面计算时字符串中存的值,其实都代表整数
    	memset(str1,0,sizeof(str1));	
    	memset(str2,0,sizeof(str2));
    
    	for(int i=0; i<alen; i++){
    		str1[i]=a[alen-i-1]-'0';	//倒置并存上与0的差值
    	}
    	for(int i=0; i<blen; i++){	
    		str2[i]=b[blen-i-1]-'0';	//倒置并存上与0的差值
    	}
    
    	int len = alen>blen ? alen : blen;
    
    	int c=0;	//进位
    	for(int i=0; i<len; i++){
    		ans[i]=str1[i]+str2[i]+c;
    		c=ans[i]/10;
    		ans[i] %=10;
    	}
    	if(c>0){	//如果最高位还有进位
    		len++;
    		ans[len-1]=c;
    	}
    
    	for(int i=0; i<len; i++){	//再倒置,并还原为数字<0-9>
    		s[i]=ans[len-1-i]+'0';	
    	}
    	s[len]='';	//加上结束符
    }
    
  • 相关阅读:
    java.util.Dictionary源码分析
    java.util.HashMap源码分析
    公钥密码与数字签名
    迭代器模式(Iterator Pattern)
    EIGamal密码体制
    RSA安全性问题
    观察者模式(Observer Pattern)
    不对称密钥密码体系之RSA
    大道至简第七章读后感
    产生随机数
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746082.html
Copyright © 2020-2023  润新知