zoukankan      html  css  js  c++  java
  • 高精度数求和,求积

    【题目描述】

    求两个不超过100位的非负整数的和。

    【输入】

    有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

    【输出】

    一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

    void PrecisionSum()
    {
    	char num1[100]="";					/*输入精度小于100位*/
    	char num2[100]="";
    	char sum[100]="";
    	scanf("%s%s",&num1,&num2);
    	int len1=strlen(num1);
    	int len2=strlen(num2);
    	char tmp=0;			//储存向高位进的数 
    	int k=len1>len2?len1:len2;
    	int lenth=k+1;		//保存输出数组的总长度
    	//计算
    	for(int i=len1-1,j=len2-1; i>=0||j>=0 ; i--,j--)
    	{	
    		//统一转化为ascall计算
    		if(num1[i]!=0 && i>=0)		num1[i]-='0';
    		if(num2[j]!=0 && j>=0)		num2[j]-='0';
    		sum[k]=tmp;				//加上低位满10后进的数
    		if(i>=0)				//若:数组1没有遍历完
    		{
    			sum[k]+=num1[i];
    		}
    		if(j>=0)				//若:数组2没有遍历完
    		{
    			sum[k]+=num2[j];
    		}
    		
    		tmp=sum[k]/10;			//是否有进位
    		sum[k]%=10;				//十进制每一位均小于10
    
    		--k;
    	}
    	sum[k]+=tmp;
    
    	//首位不为0
    	if (sum[0] == 0) 
    	{
            for (int i=0; i<lenth-1; i++)
    		{
    			sum[i] = sum[i+1] + '0';
    		}
    	
            sum[lenth-1] = 0;
        } 
    	else
    	{
            for (int i=0; i<lenth; i++) 
    		{
    			sum[i] += '0';
    		}
    
        }
    	puts(sum);
    }

    直接调用即可,可以修改首行的数组大小修改精度


    【题目描述】

    输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。

    【输入】

    输入两个高精度正整数M和N。

    【输出】

    求这两个高精度数的积。

    void PrecisionMul()//没有释放
    {
    	char num1[100]="";
    	char num2[100]="";
    	char mul[200]="";			//乘积位数小于两个因数位数之和
    	scanf("%s%s",&num1,&num2);
        if (num1[0] == '0' || num2[0] == '0') 
    	{
    		putchar('0');
    	}
        int len1 = strlen(num1);
    	int len2 = strlen(num2);
    	int len = len1+len2;
        //char *mul = (char*)malloc(sizeof(char)*(len+1));        
        ///memset(mul, 0, sizeof(char)*(len+1));
        for (int i=0; i<len1; i++) 
    	{
            for (int j=0; j<len2; j++) 
    		{
    			//len1数组循环遍历len2数组做乘积
                int x = (num1[i]-'0') * (num2[j]-'0');
    			//len1-i-1表示数组len1当前下标,len2-j-1表示数组len2当前下标,p表示乘积下标相同的元素
    			//下标和相同的数最终会相加到一起
    			/**********************************************************************
    								i0   i1  i2
    							*	j0   ji  j2
    					---------------------------
    							  j2i0 j2i1 j2i2
    						 j1i0 j1i1 j1i2
    					j0i0 j0i1 j0i2
    					---------------------------
    					ji(0)ji(1)ji(2)ji(3)ji(4)
    				乘法有如上规律,则可通过乘机项的下标分类计算
    			****************************************************************************/
                int p = len-1 - (len1-i-1) - (len2-j-1);
                mul[p] += x % 10;
                mul[p-1] += x / 10;
                while (p>0 && mul[p] >= 10) 
    			{
                    mul[p-1] += mul[p] / 10;
                    mul[p] %= 10;
                    p--;
                }
            }
        }
    	//进位取余
        for (int i=len-1; i>0; i--) 
    	{
            if (mul[i] >= 10) 
            {
                mul[i-1] += mul[i] / 10;
                mul[i] %= 10;
            }
        }
    	//消首位的0
        if (mul[0] == 0) 
        {
            for (int i=0; i<len-1; i++) mul[i] = mul[i+1] + '0';
            mul[len-1] = 0;
        } 
        else 
        {
            for (int i=0; i<len; i++) mul[i] += '0';
        }
    	puts(mul);
    }
  • 相关阅读:
    [Postman]历史(8)
    [Postman]响应(7)
    [Postman]请求(6)
    [Postman]查找替换(5)
    ORA-02050故障诊断一例
    转 js实践篇:例外处理Try{}catch(e){}
    转 PHP
    HTML DOM getElementById() 方法
    地点选择
    9i 和 11 g 区别
  • 原文地址:https://www.cnblogs.com/TaoR320/p/12680210.html
Copyright © 2011-2022 走看看