高精度除以高精度(未经过严格测试)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
void BigSubBig(char *a,char *b,char *c)
{
//a表示结果,b被减数,c减数,不能得到负数,需要进入函数之前判断
int a_int[1005]={0},b_int[1005]={0},c_int[1005]={0};
int len1,len2,len,i,owe;
len1=strlen(b);
len2=strlen(c);
for(i=0;ib_int[i]=b[len1-1-i]-'0';
for(i=0;ic_int[i]=c[len2-1-i]-'0';
len=len1>len2?len1:len2;
owe=0;
for(i=0;i{
a_int[i]=b_int[i]-c_int[i]-owe;
owe=0;
if(a_int[i]<0)
{
owe=1;
a_int[i]=a_int[i]+10;
}
}
while(a_int[len-1]==0&&len!=1)
len--;
for(i=0;ia[i]=a_int[len-1-i]+'0';
a[i]='\0';
}
int compare(char *a,char *b)
{
int len1=strlen(a);
int len2=strlen(b);
if(len1>len2)
return 1;
if(len1return -1;
return strcmp(a,b);
}
void BigNumDividBig(char *a,char *arr,char *b,char *c)
{

char temp[1005],time[1005];
int j,lentime,len,i,flag,k;
if(compare(b,c)==-1)
{
a[0]='0';
a[1]='\0';
strcpy(arr,b);
}
else if(compare(b,c)==0)
{
a[0]='1';
a[1]='\0';
arr[0]='0';
arr[1]='\0';
}
else
{
j=lentime=0;
len=strlen(b);
memset(temp,0,sizeof(temp));
memset(time,0,sizeof(time));
for(i=0;i{//计算得到被除数的前几位,得到整型数组形式的商
//time的一个元素表示一次相除的商
temp[j++]=b[i];
flag=0;
while(compare(temp,c)>=0)
{
BigSubBig(temp,temp,c);
time[lentime]++;
flag=1;//控制time的元素的位置
}
if(flag)//将商转换为字符
time[lentime]+='0';
else//当被除数前几位小于除数,商补
time[lentime]='0';

if(!strcmp(temp,"0"))//若temp为''
j=0;
else//继续在b的后面加值
j=strlen(temp);
lentime++;
}
k=0;
for(i=0;iif(time[i]!='0')
break;//找到time数组中第一个不为的位置
for(j=i;ja[k++]=time[j];
if(i==lentime)
a[k++]='0';
a[k]='\0';
strcpy(arr,temp);
}
}
int main()
{
char a[1005],b[1005],out[1005],arr[1005];
while(scanf("%s%s",a,b)!=EOF)
{
BigNumDividBig(out,arr,a,b);
printf("%s\n",arr);
}
return 0;
}#include
#include
void BigSubBig(char *a,char *b,char *c)
{
//a表示结果,b被减数,c减数,不能得到负数,需要进入函数之前判断
int a_int[1005]={0},b_int[1005]={0},c_int[1005]={0};
int len1,len2,len,i,owe;
len1=strlen(b);
len2=strlen(c);
for(i=0;ib_int[i]=b[len1-1-i]-'0';
for(i=0;ic_int[i]=c[len2-1-i]-'0';
len=len1>len2?len1:len2;
owe=0;
for(i=0;i{
a_int[i]=b_int[i]-c_int[i]-owe;
owe=0;
if(a_int[i]<0)
{
owe=1;
a_int[i]=a_int[i]+10;
}
}
while(a_int[len-1]==0&&len!=1)
len--;
for(i=0;ia[i]=a_int[len-1-i]+'0';
a[i]='\0';
}
int compare(char *a,char *b)
{
int len1=strlen(a);
int len2=strlen(b);
if(len1>l

en2)
return 1;
if(len1return -1;
return strcmp(a,b);
}
void BigNumDividBig(char *a,char *arr,char *b,char *c)
{

char temp[1005],time[1005];
int j,lentime,len,i,flag,k;
if(compare(b,c)==-1)
{
a[0]='0';
a[1]='\0';
strcpy(arr,b);
}
else if(compare(b,c)==0)
{
a[0]='1';
a[1]='\0';
arr[0]='0';
arr[1]='\0';
}
else
{
j=lentime=0;
len=strlen(b);
memset(temp,0,sizeof(temp));
memset(time,0,sizeof(time));
for(i=0;i{//计算得到被除数的前几位,得到整型数组形式的商
//time的一个元素表示一次相除的商
temp[j++]=b[i];
flag=0;
while(compare(temp,c)>=0)
{
BigSubBig(temp,temp,c);
time[lentime]++;
flag=1;//控制time的元素的位置
}
if(flag)//将商转换为字符
time[lentime]+='0';
else//当被除数前几位小于除数,商补
time[lentime]='0';

if(!strcmp(temp,"0"))//若temp为''
j=0;
else//继续在b的后面加值
j=strlen(temp);
lentime++;
}
k=0;
for(i=0;iif(time[i]!='0')
break;//找到time数组中第一个不为的位置
for(j=i;ja[k++]=time[j];
if(i==lentime)
a[k++]='0';
a[k]='\0';
strcpy(arr,temp);
}
}
int main()
{
char a[1005],b[1005],out[1005],arr[1005];
while(scanf("%s%s",a,b)!=EOF)
{
BigNumDividBig(out,arr,a,b);
printf("%s\n",arr);
}
return 0;
}

相关文档
最新文档