/*我做了一个,你看看,应该可以很容易懂得*/
#include
#define M 50
main()
{char a[M],b[M],c[M],d[M];
int ia,ib,ic,id;
printf("input a:");
scanf("%s",a);/*输入a*/
printf("\ninput b:");
scanf("%s",b);/*输入b*/
ia=strlen(a);
ib=strlen(b);/*求出a,b的长度(也是输入数据的位数)*/
if(ia>ib){strcpy(c,a);strcpy(d,b);}/*比较两个并前的长短,把长的那个放到c里,短的放到d里*/
else if(ia==ib&&(a[0]+b[0]-'0'>'9')){/*如果两绝余清数毁祥位数一样,考虑首位相加进位,并事先多准备一个位置*/
ic=ia+1;c[0]='0';c[1]='\0';strcat(c,a);strcpy(d,b);}
else {strcpy(c,b);strcpy(d,a);}/*比较两个的长短,把长的那个放到c里,短的放到d里*/
ic=strlen(c);
id=strlen(d);/*求出实际参加运算的c,d的长度*/
do{id--;ic--;
c[ic]=c[ic]+d[id]-'0';/*运算*/
if(c[ic]>'9'){c[ic]-=10;c[ic-1]+=1;}/* 处理进位,逢十进一,原位减十,前位加一*/
}while(ic!=0&&id!=0);
printf("\n%s+%s=%s\n",a,b,c);
}
#include
#define M 50
main()
{char a[M],b[M],c[M],d[M];
int ia,ib,ic,id;
printf("input a:");
scanf("%s",a);/*输入a*/
printf("\ninput b:");
scanf("%s",b);/*输入b*/
ia=strlen(a);
ib=strlen(b);/*求出a,b的长度(也是输入数据的位数)*/
if(ia>ib){strcpy(c,a);strcpy(d,b);}/*比较两个的长短,把长的那个放到c里,短的放到d里*/
else if(ia==ib&&(a[0]+b[0]-'0'历兄>'9')){/*如果两数位数一样,考虑首位相加进位,并事先多准备一个位置*/
ic=ia+1;c[0]='0';c[1]='\0';strcat(c,a);strcpy(d,b);}
else {strcpy(c,b);strcpy(d,a);}/*比较两个的长短,把长的那个放到c里,短的放到d里*/
ic=strlen(c);
id=strlen(d);/*求出实际参加运算的c,d的长度*/态档
do{id--;ic--;
c[ic]=c[ic]+d[id]-'0';/*运算*/
if(c[ic]>'9'){c[ic]-=10;c[ic-1]+=1;}/* 处理进位,逢十进一,原位减十,前位加一*/
}while(ic!=0&&id!=0);
printf("\n%s+%s=%s\n",a,b,c);
}
主要考虑进位问帆烂乱题,逢十进一。
你可以用字符串来表示那些超长的数字,然后写一个求和的函数直接对它们进行操作。
下羡隐锋面的 unsignedAdd 既是这样的一个函数:
#include
#include
#include
/* Returns the sum of a and b. */
char *unsignedAdd( const char *a, const char *b ) {
int aI = strlen( a ),
bI = strlen( b ),
rI = aI > bI ? aI : bI;
char *result = calloc( rI + 1, 1 );
if ( result != NULL )
while( rI-- ) {
result[ rI ] += ( --aI >= 0 ? a[ aI ] : '0' ) +
携芹 ( --bI >= 0 ? b[ bI ] : '0' ) - '0';
if( result[ rI ] > '9' ) {
result[ rI ] -= 10;
if( rI > 0 )
result[ rI - 1 ]++;
else { /* grow to fit the final carry */
result = realloc( result, strlen( result ) + 2 );
if ( result != NULL ) {
memmove( result + 1, result, strlen( result ) + 1 );
result[ 0 ] = '1';
}
兄晌 }
}
}
return result;
}
void main( ) {
char *a = "112233445566778899",
*b = "998877665544332211",
*x = "3138550867693340381917894711603833208051177722232017256448",
*y = "5986310706507378352962293074805895248510699696029696";
puts( unsignedAdd( a, b ) );
puts( unsignedAdd( x, y ) );
}
这个式子可以你分解来看!如
1122+9988
你可以看成
22+88=110
此时陆兆悄有进位时你把进位拿出来!就是判断位数大猜侍于2时拿出1
11+99+1=111
此时要加上1的进位!
最后结果把下列值加起来就可以了!
11110
可以用高位数据右移两位+低早渣位数据就可以了!
这种程序最好使用数组。
把A和B分别存入两个整型数组,每一位存一个数字,按数位进行计算(个位消祥跟个位,十位跟十位这样),注意进位仔宏情况,计算后的结念桥册果也存入一个整型数组。