/* 核心思想:除法化减法,考察从被除数里最多能减去几个除数, 商就为几。 就是考察除数的1次倍,10次倍,100次倍.....分别有几个。 */ #include <stdio.h> #include <string.h> #define MAX_LEN 200 char szLine1[MAX_LEN + 10]; char szLine2[MAX_LEN + 10]; int an1[MAX_LEN + 10]; //被除数, an1[0]对应于个位 int an2[MAX_LEN + 10]; //除数, an2[0]对应于个位 int aResult[MAX_LEN + 10]; //存放商 //长度为 nLen1 的大整数p1 减去长度为nLen2 的大整数p2 //结果放在p1 里,返回值代表结果的长度 //如不够减返回-1,正好减完返回 0 int Substract( int * p1, int * p2, int nLen1, int nLen2) { int i; if( nLen1 < nLen2 ) return -1; //下面判断p1 是否比p2 大,如果不是,返回-1 if( nLen1 == nLen2 ) { for( i = nLen1-1; i >= 0; i -- ) //从高位开始比较 { if( p1[i] > p2[i] ) break; //p1>p2 else if( p1[i] < p2[i] ) return -1; //p1<p2 } } for( i = 0; i < nLen1; i ++ ) { //调用本函数确保当i>=nLen2 时,p2[i] = 0 p1[i] -= p2[i]; if( p1[i] < 0 ) { p1[i]+=10; //借位 p1[i+1] --; } } for( i = nLen1 -1 ; i >= 0 ; i-- ) if( p1[i] ) //找到最高位第一个不为0 return i + 1; return 0; //全部为0,说明两者相等 } int main() { int t, n; scanf("%d", &n); for( t = 0; t < n; t ++ ) { scanf("%s", szLine1); scanf("%s", szLine2); int i, j; int nLen1 = strlen( szLine1); int nLen2 = strlen(szLine2); memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); memset( aResult, 0, sizeof(aResult)); for( j = 0, i = nLen1 - 1;i >= 0 ; i --) an1[j++] = szLine1[i] - '0'; for( j = 0, i = nLen2 - 1;i >= 0 ; i --) an2[j++] = szLine2[i] - '0'; if( nLen1 < nLen2 ) { printf("0\n"); continue; } int nTimes = nLen1 - nLen2; //两个数相差的10的最大次倍 if(nTimes > 0) { for( i = nLen1 -1; i >= nTimes; i -- ) an2[i] = an2[i-nTimes]; //朝高位移动 for( ; i >= 0; i--) //低位补0 an2[i] = 0; nLen2 = nLen1; //两数最高位对齐,修改p2长度(便于除法运算) } for( j = 0 ; j <= nTimes; j ++ ) { int nTmp; //先减去若干个 an2×(10 的 nTimes 次方),一直减到不够减为止 //不够减了,再减去若干个 an2×(10 的 nTimes-1 次方),...... while( (nTmp = Substract(an1, an2+j, nLen1, nLen2-j)) >= 0) { nLen1 = nTmp; aResult[nTimes-j]++; //每成功减一次,则将商的相应位加1 } } //下面输出结果,先跳过高位0 for( i = MAX_LEN ; (i >= 0) && (aResult[i] == 0); i -- ); if( i >= 0) for( ; i>=0; i--) printf("%d", aResult[i]); else printf("0"); printf("\n"); } return 0; }
原文地址:http://blog.csdn.net/huolang_vip/article/details/42880129