高精度除法算法流程:
第一步,读入被除数 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;
}