回 帖 发 新 帖 刷新版面

主题:C++求救啊

有人能帮我找找这里面的除法错误在哪里吗~~我今天弄了好久~~没有错误了~~可是一运行除法就自动关闭窗口~~其他的加减乘法都不会~~~拜托你们帮忙啦}

回复列表 (共1个回复)

沙发


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; 

 }

我来回复

您尚未登录,请登录后再回复。点此登录或注册