关于蝎子朋友的回复,大整数加减程序的不足尤其是蝎子请进!
//减法时,result[0]是符号位;
/*
* 1、只考虑正整数
*/
#include <stdio.h>
#include <stdlib.h>
int a[100], b[100], result[101];
void parseInt( char *strNum, int array[] ) {
int ix;
for( ix=0; strNum[ix]!='\0'; ++ix )
array[ix]=strNum[ix]-'0';
array[ix]=-1; /*数字结束*/
}
void displayNum( int array[] ) {
int ix;
for( ix=0; array[ix]!=-1; ++ix )
printf( "%d", array[ix] );
printf("[%d]", ix);
}
int getStartPos( int array[] ) {
int ix=0;
while( array[ix]!=-1 )
++ix;
return ix-1;
}
void doCal( int numOne[], int numTwo[], int numResult[], char oper ) {
/* 从个位开始运算 */
int onePos, twoPos, resultPos; /* 记录位置 */
int carry; /* 进位 */
int *tp; /* 减法时可能用到 */
onePos = getStartPos( numOne );
twoPos = getStartPos( numTwo );
resultPos = (onePos>twoPos)?onePos:twoPos + 1; /* 多一位,以备进位用;
或保存符号 */
numResult[ resultPos+1 ] = -1;
carry = 0;
switch( oper ) {
case '+':
while( onePos>=0 || twoPos>=0 ) {
if( onePos>=0 ) {
numResult[ resultPos ] = numOne[onePos];
--onePos;
}
else
numResult[ resultPos ] = 0;
if( twoPos>=0 ) {
numResult[ resultPos ] += numTwo[twoPos]+carry;
--twoPos;
}
else
numResult[ resultPos ] += carry;
if( numResult[resultPos]>10 ) {
carry = numResult[resultPos]/10;
numResult[resultPos]=numResult[resultPos]%10;
} else
carry = 0;
--resultPos;
}
if( carry!=0 )
numResult[ resultPos ] = carry;
else
numResult[ resultPos ] = 0;
break;
case '-':
if( onePos<twoPos || (onePos==twoPos && numOne[0]<numTwo[0]) ) {
numResult[0]=1;
// doCal(numTwo, numOne, numResult, '-');
tp = numOne;
numOne = numTwo;
numTwo = tp;
carry=onePos;
onePos = twoPos;
twoPos = carry;
carry = 0;
} else
numResult[0]=0;
while( onePos>=0 || twoPos>=0 ) {
if( onePos>=0 ) {
numResult[ resultPos ] = numOne[onePos];
--onePos;
}
else
numResult[ resultPos ] = 0;
if( twoPos>=0 ) {
numResult[ resultPos ] -= numTwo[twoPos]+carry;
--twoPos;
}
else
numResult[ resultPos ] -= carry;
if( numResult[resultPos]<0 ) {
carry = 1;
numResult[resultPos] += 10;
} else
carry = 0;
--resultPos;
}
// numResult[ resultPos ] = 0;
break;
default:
break;
}
displayNum( a );
printf(" %c ", oper);
displayNum( b );
printf(" = ");
displayNum( result );
printf("\n");
}
void main() {
char *strNum;
a[0]=-1;
b[0]=-1;
result[0]=-1;
strNum=(char*)malloc( 100*sizeof(char) );
printf("Enter number a: ");
scanf("%s", strNum);
parseInt( strNum, a );
printf("Enter number b: ");
scanf("%s", strNum);
parseInt( strNum, b );
// doCal( a, b, result, '+' );
doCal( a, b, result, '-' );
}
蝎子朋友的程序很好,但我经过测试后发现两个主要问题:其一,当相同位数相加为整十进位有问题;二是相减被减数大余减数时有错,如果还在或是其他朋友有兴趣的话,烦请指教!