高精度除高精度和高精度开方

高精度除法算法流程:
第一步,读入被除数 a 和 除数 b,判断是否 a < b,是则输出 0 并结束算法,否则令 answer := 0;
第二步,令余数 remainder := 0,令 i 从被除数最高位的下标开始;
第三步,令 remainder := remainder * 10 + a[i],令 c := 9;
第四步,判断是否 b * c > remainder(高乘单),是则 c := c - 1 转第四步;
第五步,answer := answer * 10 + c,remainder := remainder - b * c(高减高),i := i - 1;
第六步,判断是否 i < 0,否则转第三步;
第七步,输出 answer。

代码如下:

#include"stdio.h"
#include"string.h"
#define MAX_SIZE 505
char temporary_a[MAX_SIZE],temporary_b[MAX_SIZE];
int a[MAX_SIZE],answer[MAX_SIZE],b[MAX_SIZE],product[MAX_SIZE],remainder[MAX_SIZE];
int main()
{
	//freopen("HighDivide.in","r",stdin);
	//freopen("HighDivide.out","w",stdout);
	int a_length,b_length,product_length,remainder_length;
	scanf("%s",temporary_a);
	a_length=remainder_length=strlen(temporary_a);
	for(int i=0;i<a_length;i++)
		a[i]=temporary_a[a_length-i-1]-'0';
	scanf("%s",temporary_b);
	b_length=strlen(temporary_b);
	for(int i=0;i<b_length;i++)
		b[i]=temporary_b[b_length-i-1]-'0';
	if(a_length<b_length||a_length==b_length&&strcmp(temporary_a,temporary_b)<0)
	{
		printf("0");
		return 0;
	}
	for(int i=a_length-1;i>=0;i--)
	{
		remainder[i]=a[i];
		for(answer[i]=9;answer[i]>0;answer[i]--)
		{
			product[i]=0;
			product_length=b_length+i;
			for(int j=0;j<b_length;j++)
				product[i+j]+=answer[i]*b[j],
				product[i+j+1]=product[i+j]/10,
				product[i+j]%=10;
			if(product[product_length]!=0)
				product_length++;
			if(product_length==remainder_length)
			{
				memset(temporary_a,'0',sizeof(temporary_a));
				memset(temporary_b,'0',sizeof(temporary_b));
				for(int j=0;i+j<product_length;j++)
					temporary_a[j]=product[product_length-j-1]+'0';
				for(int j=0;i+j<remainder_length;j++)
					temporary_b[j]=remainder[remainder_length-j-1]+'0';
			}
			if(product_length<remainder_length||product_length==remainder_length&&strcmp(temporary_a,temporary_b)<=0)
				break;
		}
		if(answer[i]!=0)
		{
			for(int j=i;j<remainder_length;j++)
				remainder[j]-=product[j]-10,remainder[j+1]-=1-remainder[j]/10,remainder[j]%=10;
			for(;remainder_length>i&&remainder[remainder_length-1]==0;remainder_length--);
		}
	}
	if(answer[a_length-b_length]==0)
		a_length--;
	for(int i=a_length-b_length;i>=0;i--)
		printf("%d",answer[i]);
	return 0;
}

高精度开方算法流程:
第一步,读入被开方数 n,令 answer := 0;
第二步,令余数 remainder := 0,令 i 从被开方数最高位的下标开始,若 i 为奇数则 i := i - 1;
第三步,令 remainder := remainder * 100 + n[i + 1] * 10 + n[i],令 m := 9;
第四步,判断是否 (answer * 20 + m) * m > remainder(高乘单),是则 m := m - 1 转第四步;
第五步,answer := answer * 10 + m,remainder := remainder - (answer * 20 + m) * m(高减高),i := i - 2;
第六步,判断是否 i < 0,否则转第三步;
第七步,输出 answer。

代码如下:

#include"stdio.h"
#include"string.h"
#define MAX_SIZE 1005
char temporary[MAX_SIZE],temporary_product[MAX_SIZE],temporary_remainder[MAX_SIZE];
int answer[MAX_SIZE],multiplier[MAX_SIZE],number[MAX_SIZE],product[MAX_SIZE],remainder[MAX_SIZE];
int main()
{
	freopen("HighSqrt.in","r",stdin);
	freopen("HighSqrt.out","w",stdout);
	memset(number,0,sizeof(number));
	int answer_length=0,multiplier_length,number_length,product_length,remainder_length=0;
	scanf("%s",temporary);
	number_length=strlen(temporary);
	for(int i=0;i<number_length;i++)
		number[i]=temporary[number_length-i-1]-'0';
	for(int i=(number_length-1)/2*2;i>=0;i-=2)
	{
		for(int j=remainder_length-1;j>=0;j--)
			remainder[j+2]=remainder[j];
		remainder_length+=2;
		remainder[0]=number[i];
		remainder[1]=number[i+1];
		for(;remainder_length>0&&remainder[remainder_length-1]==0;remainder_length--);
		memset(multiplier,0,sizeof(multiplier));
		for(multiplier_length=1;multiplier_length<=answer_length;multiplier_length++)
			multiplier[multiplier_length]+=answer[answer_length-multiplier_length]*2,
			multiplier[multiplier_length+1]+=multiplier[multiplier_length]/10,
			multiplier[multiplier_length]%=10;
		if(multiplier[multiplier_length]!=0)
			multiplier_length++;
		for(multiplier[0]=9;multiplier[0]>=0;multiplier[0]--)
		{
			memset(product,0,sizeof(product));
			for(product_length=0;product_length<multiplier_length;product_length++)
				product[product_length]+=multiplier[0]*multiplier[product_length],
				product[product_length+1]+=product[product_length]/10,
				product[product_length]%=10;
			if(product[product_length]!=0)
				product_length++;
			for(;product_length>0&&product[product_length-1]==0;product_length--);
			if(product_length==remainder_length)
			{
				for(int j=0;j<product_length;j++)
					temporary_product[j]=product[product_length-j-1]+'0';
				for(int j=0;j<remainder_length;j++)
					temporary_remainder[j]=remainder[remainder_length-j-1]+'0';
			}
			if(product_length<remainder_length||product_length==remainder_length&&strcmp(temporary_product,temporary_remainder)<=0)
				break;
		}
		answer[answer_length++]=multiplier[0];
		for(int j=0;j<remainder_length;j++)
			remainder[j]-=product[j]-10,remainder[j+1]-=1-remainder[j]/10,remainder[j]%=10;
		for(;remainder_length>0&&remainder[remainder_length-1]==0;remainder_length--);
	}
	for(int i=0;i<answer_length;i++)
		printf("%d",answer[i]);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值