题目:大整数除法,求商和余数。
分析:模拟。用减法模拟即可。
从最左边开始,利用除数和当前位置起始的数比价,如果除数大则右移,否则减去除数。
说明:注意是0的情况,不要输出空。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
char a[10000],b[10000];
int A[10000],B[10000],Q[10000];
void divid( char* a, char o, char *b )
{
memset( A, 0, sizeof(A) );
memset( B, 0, sizeof(B) );
memset( Q, 0, sizeof(Q) );
int len_a = 0;
for ( int i = 0 ; a[i] ; ++ i )
A[len_a ++] = a[i]-'0';
int len_b = 0;
for ( int i = 0 ; b[i] ; ++ i )
B[len_b ++] = b[i]-'0';
int now = 0;
while ( len_a - now >= len_b ) {
while ( 1 ) {
int flag = 1;
for ( int i = 0 ; i < len_b ; ++ i )
if ( A[now+i] > B[i] )
break;
else if ( A[now+i] < B[i] ) {
flag = 0;
break;
}
if ( !flag ) break;
Q[now] ++;
for ( int i = len_b-1 ; i >= 0 ; -- i ) {
A[now+i] -= B[i];
if ( A[now+i] < 0 ) {
A[now+i] += 10;
A[now+i-1] --;
}
}
}
if ( now < len_a-1 ) {
A[now+1] += A[now]*10;
A[now] = 0;
}
now ++;
}
if ( o == '/' ) {
int start = 0;
while ( start < now-1 && !Q[start] )
start ++;
while ( start < now )
printf("%d",Q[start ++]);
if ( !now ) printf("0");
printf("\n");
}else {
int start = 0;
while ( start < len_a-1 && !A[start] )
start ++;
while ( start < len_a )
printf("%d",A[start ++]);
printf("\n");
}
}
int main()
{
char oper;
while ( ~scanf("%s %c %s",a,&oper,b) )
divid( a, oper, b );
return 0;
}