To my CSDN

高精度数求和,求积

【题目描述】

求两个不超过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);
}

 

posted @ 2019-05-19 18:22  我叫RT  阅读(325)  评论(0编辑  收藏  举报