- 论坛徽章:
- 1
|
[求助] 有点难度D,请老大们指点
终于做出来了!
大家顺便帮我测试一下、优化一下。
- # include <stdio.h>;
- # include <stdlib.h>;
- # include <string.h>;
- # include <conio.h>;
- # define MAX_LEN 1000
- int XAdd( char *p, char *a, char *b ); //将 a 和 b 相加, 结果存放在 p 中
- void XChange( char *a, char *b ); //将 a 倒置,存入 b 中。
- void main( void )
- {
- char *a = NULL, *b = NULL, *p = NULL;
- int ch, i, level = 0;
- a = (char *)malloc( sizeof(char) * (MAX_LEN+1) );
- b = (char *)malloc( sizeof(char) * (MAX_LEN+1) );
- p = (char *)malloc( sizeof(char) * (MAX_LEN+1) );
- if ( a == NULL || b == NULL || p == NULL )
- {
- fprintf( stderr, "Malloc memory failed!\n" );
- if ( a ) free(a);
- if ( b ) free(b);
- if ( p ) free(p);
- return;
- }
- memset( a, 0x00, MAX_LEN+1 );
- memset( b, 0x00, MAX_LEN+1 );
- memset( p, 0x00, MAX_LEN+1 );
- fprintf( stderr, "Input: " );
- i = 0;
- while( i < MAX_LEN )
- {
- ch = getch();
- if ( ch < '0' || ch >; '9' )
- break;
- a[i++] = ch;
- fprintf( stderr, "%c", ch );
- }
- fprintf( stderr, "\nYou input is: [%s]\n", a );
- while( XChange( a, b ), strcmp( a, b ) )
- {
- if ( XAdd( p, a, b ) )
- break;
- fprintf( fp, "%s + %s = %s\n", a, b, p );
- strcpy( a, p );
- level ++;
- }
- fprintf( stderr, "LEVEL: [%d]\n", level );
- free( a );
- free( b );
- free( p );
- return ;
- }
- void XChange( char *a, char *b )
- {
- int len, i;
- len = strlen(a);
- b[len-1] = 0;
- for( i=0; i<len; i++ )
- b[len - i - 1] = a[i];
- return;
- }
- int XAdd( char *p, char *a, char *b )
- {
- int la, lb, i, carry=0, k;
- char temp[MAX_LEN+1];
- memset(temp, 0x00, MAX_LEN+1);
- la = strlen( a );
- lb = strlen( b );
- // 考虑溢出.
- if ( (la>;lb?la:(lb>;la?lb:lb+1) >; MAX_LEN && a[0]+b[0] >; 8+2*'0' )
- return 1;
- // 下面就象小学生做算术一样。一定要考虑到进位
- for( i=0; la>;0 && lb>;0; i++, la--, lb-- )
- {
- temp[i] = a[la-1] + b[lb-1] - '0' + carry;
- if ( temp[i] >; '9' )
- {
- temp[i] -= 10;
- carry = 1;
- }
- else
- carry = 0;
- }
- // 如果还有没对齐的部分,要照抄过来,注意 carry,一定要考虑到进位
- while( la >; 0 )
- {
- temp[i] = a[la---1] + carry;
- if ( temp[i] >; '9' )
- {
- temp[i] -= 10;
- carry = 1;
- }
- else
- carry = 0;
- i++;
- }
- while( lb >; 0 )
- {
- temp[i] = b[lb---1] + carry;
- if ( temp[i] >; '9' )
- {
- temp[i] -= 10;
- carry = 1;
- }
- else
- carry = 0;
- i++;
- }
- temp[i] = carry + '0';
- // 下面这个循环去除高位的 ‘0’
- while( temp[i] == '0' )
- i--;
- // 由于 temp 中的内容是高位在后,所以要倒置一下。
- for( k=0; i>;=0; i--, k++ )
- p[k] = temp[i];
- p[k] = 0;
- return 0;
- }
复制代码 |
|