主题:C++求救啊
jq536434324
[专家分:0] 发布于 2011-04-09 01:33:00
有人能帮我找找这里面的除法错误在哪里吗~~我今天弄了好久~~没有错误了~~可是一运行除法就自动关闭窗口~~其他的加减乘法都不会~~~拜托你们帮忙啦}
回复列表 (共1个回复)
沙发
jq536434324 [专家分:0] 发布于 2011-04-09 01:35:00
int Substract( int * p1, int * p2, int nLen1, int nLen2)
{
int i;
if( nLen1 < nLen2 )
return -1;
//下面判断 p1是否比 p2大,如果不是,返回-1
bool bLarger = false;
if( nLen1 == nLen2 ) {
for( i = nLen1-1; i >= 0; i -- ) {
if( p1[i] > p2[i] )
bLarger = true;
else if( p1[i] < p2[i] ) {
if ( ! bLarger )
return -1;
}
}
}
for( i = 0; i < nLen1; i ++ ) { //做减法
p1[i] -= p2[i]; //要求调用本函数时给的参数能确保当 i>=nLen2时,p2[i] = 0
if( p1[i] < 0 ) {
p1[i]+=10;
p1[i+1] --;
}
}
for( i = nLen1 -1 ; i >= 0 ; i-- )
if( p1[i] )
return i + 1;
return 0;
}
int BigNumsChu(char *numa,char *numb)
{
#define MAX_LEN 10000000
int an1[MAX_LEN + 10];
int an2[MAX_LEN + 10];
int aResult[MAX_LEN + 10];
int t, n;
int *Num1=NULL,*Num2=NULL,*answer=NULL;
int weishu1,weishu2;
Num1=(int*)malloc((MAX_LEN+1)*sizeof(int));
Num2=(int*)malloc((MAX_LEN+1)*sizeof(int));
n=1;
for( t = 0; t < n; t ++ ) {
switcher(numa,Num1,weishu1);
switcher(numb,Num2,weishu2);
int i, j;
int nLen1 = strlen( numa);
memset( an1, 0, sizeof(an1));
memset( an2, 0, sizeof(an2));
memset( aResult, 0, sizeof(aResult));
int nLen2 = strlen(numb);
if( nLen1 < nLen2 ) {
printf("0\n");
continue;
}
nLen1 = Substract( an1, an2, nLen1, nLen2) ;
if( nLen1 < 0) {
printf("0\n");
continue;
}
else if( nLen1 == 0) {
printf("1\n");
continue;
}
aResult[0] ++; //减掉一次了,商加 1
//减去一次后的结果长度是 nLen1
int nTimes = nLen1 - nLen2;
if( nTimes < 0) //减一次后就不能再减了
goto OutputResult;
else if( nTimes > 0 ) {
//将 an2 乘以 10的某次幂,使得结果长度和 an1相同
for( i = nLen1 -1; i >= 0; i -- ) {
if( i >= nTimes )
an2[i] = an2[i-nTimes];
else
an2[i] = 0;
}
}
nLen2 = nLen1;
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
}
}
OutputResult:
//下面的循环统一处理进位问题
for( i = 0; i < MAX_LEN; i ++ ) {
if( aResult[i] >= 10 ) {
aResult[i+1] += aResult[i] / 10;
aResult[i] %= 10;
}
}
//下面输出结果
bool bStartOutput = false;
for( i = MAX_LEN ; i >= 0; i -- )
if( bStartOutput)
printf("%d", aResult[i]);
else if( aResult[i] ) {
printf("%d", aResult[i]);
bStartOutput = true;
}
if(! bStartOutput )
printf("0\n");
printf("\n");
}
system("pause");
return 0;
}
我来回复