当前编程题:实验三 大数、枚举问题(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; } |