练习系统 实验三 大整数除法

当前编程题:实验三 大数、枚举问题(16级)---大整数除法

5.
问题描述
求2个大的正整数相除的商
输入形式
第1行是测试数据的组数n,每组测试数据占2行,第1行是被除数,第2行是除数。每组测试数据之间有一个空行,每行数据不超过100个字符
输出形式
n行,每组测试数据有一行输出是相应的整数商
样例输入
3
2405337312963373359009260457742057439230496493930355595797660791082739646
2987192585318701752584429931160870372907079248971095012509790550883793197894
 
10000000000000000000000000000000000000000
10000000000
 
5409656775097850895687056798068970934546546575676768678435435345
1
 
 
样例输出
0
1000000000000000000000000000000
5409656775097850895687056798068970934546546575676768678435435345



#include<stdio.h>
#include<string.h>




int judge(int maxlenth,int aa1[],int bb1[])   //比较两个大整数的大小  注意 大整数的个位是用零下标所表示的
{
int i;
for(i=maxlenth-1;i>=0;i--)
{
if(aa1[i]>bb1[i])                            //说明大整数aa1大于大整数bb1
{
return 1;
}
else
{
if(aa1[i]<bb1[i])
{
return -1;                        //说明大整数aa1小于大整数bb1
}
}
}
return 0;                                               //说明两个大整数相等
}




void shift(int maxlenth,int *bb1,int *temp,int shiftnum)           //将小的那个大整数乘以10的shiftnum次方,便于减法的运算
{
int i;
for(i=maxlenth-1;i>=0;i--)
{
if(i-shiftnum>=0)
{
temp[i]=bb1[i-shiftnum];
}
else
{
temp[i]=0;
}
}
}


void subtract(int maxlenth,int *aa1,int *temp)                 //两个大整数相减,用指针来将相减后的结果传到主函数
{
int i;
for(i=0;i<maxlenth;i++)
{
aa1[i]-=temp[i];
if(aa1[i]<0)
{
aa1[i]+=10;
aa1[i+1]--;
}
}
}


int main()
{
char aa[101],bb[101],nouse[10];
int aa1[101],bb1[101],temp[101],mem[100];
int i,n,flag,lenth1,lenth2,shiftnum;
scanf("%d",&n);
getchar();
while(n--)
{
flag=0;
gets(aa);
gets(bb);
lenth1=strlen(aa);
lenth2=strlen(bb);
memset(aa1,0,sizeof(aa1));                                   //清零
memset(bb1,0,sizeof(bb1));                                  //清零
for(i=lenth1-1;i>=0;i--)                                               //将aa1字符串用整形数组表示,下同
{
aa1[lenth1-i-1]=aa[i]-'0';
}
for(i=lenth2-1;i>=0;i--)
{
bb1[lenth2-1-i]=bb[i]-'0';
// printf("%d ",bb1[i]);
}
shiftnum=lenth1-lenth2;
if(shiftnum<0)
{
printf("0\n");
gets(nouse);
continue;
}
memset(temp,0,sizeof(temp));
memset(mem,0,sizeof(mem));
/* for(i=0;i<10;i++)
{
printf(" %d",mem[i]);
}
printf("\n");
*/
while(judge(lenth1,aa1,bb1)>=0)
{

shift(lenth1,bb1,temp,shiftnum);
/* for(i=lenth1-1;i>=0;i--)
{
printf("%d ",temp[i]);
}
printf("\n");
*/
while(judge(lenth1,aa1,temp)>=0)
{
// printf("%d\n",mem[shiftnum]);
subtract(lenth1,aa1,temp);
mem[shiftnum]++;
}
// printf("   %d\n",mem[shiftnum]);
if(flag==0&&mem[shiftnum])
{
flag=shiftnum;
//printf("  %d\n",shiftnum);
}
shiftnum--;
}
/* for(i=lenth1-1;i>=0;i--)
{
printf("%d ",aa1[i]);
}
printf("\n");
*/
for(i=flag;i>=0;i--)
{
printf("%d",mem[i]);
}
printf("\n");
gets(nouse);
}
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值