c语言程序中怎样实现"任意两个32位数相加"

急!
急!
急!
急!
急!

正如楼上 heephi 所说, 用数组来存放 32 位数,
就是数组每个元素存入这个 32 位数的每一位

如 有数 11111111112222222222333333333300
那么数组其实就是 {1, 1, ..., 1, 2, 2, ..., 2, 3, 3, ..., 3, 0, 0}

在此基础上, 对每位进行相加, 遵循 满十进一的规则

看样例:
#include <stdio.h>

int main()
{
int a[32], b[32], c[32] = {0};
int i;

char buf[33]; /* 用于存入输入的数字(其实就是字符串) */

printf("请输入数 A: "); scanf("%s", buf);
for (i = 0; i < 32; i++)
{
if (buf[i] < '0' || buf[i] > '9')
{
printf("对不起, 你的输入有错, 可能出现非数字字符或数字长度不为 32");
return 0; /* exit(0) */
}
a[i] = buf[i] - 0x30;
/* 因为 '0' 的 ASCII 码是48, 0x30 表示十六进制也就是十进制的 48,
所以 '0' - 0x30 就是 0, '9' - 0x30 就是 9, 也就实现了数字字符转为数字 */
}
printf("请输入数 B: "); scanf("%s", buf);
for (i = 0; i < 32; i++)
{
if (buf[i] < '0' || buf[i] > '9')
{
printf("对不起, 你的输入有错, 可能出现非数字字符或数字长度不为 32");
return 0; /* exit(0); */
}
b[i] = buf[i] - 0x30;
/* 因为 '0' 的 ASCII 码是48, 0x30 表示十六进制也就是十进制的 48,
所以 '0' - 0x30 就是 0, '9' - 0x30 就是 9, 也就实现了数字字符转为数字 */
}

/* 好了, 现在就是实现相加了 */
for (i = 31; i >= 0; i--)
{
c[i] += a[i] + b[i];
if (c[i] > 10)
{
c[i] -= 10;
if (i != 0) c[i - 1] += 1;
}
}

/* 相加完成, 现在输出结果 a + b = c */
printf("\n\n\t");
for (i = 0; i < 32; i++)
{
printf("%d", a[i]);
}
printf("\n +\t");
for (i = 0; i < 32; i++)
{
printf("%d", b[i]);
}
printf("\n-----------------------------------------\n\t");
for (i = 0; i < 32; i++)
{
printf("%d", c[i]);
}
printf("\n");

return 0;
}

这个程序有些缺陷:
1. 必须两个数均为 32 位, 所以不能计算一个 32 位数与位数小于 32 的数相加
2. 当两数相加大于 32 位数时, 只能显示最后 32 位数, 也就是溢出
3. 不能实现负数相加

程序运行结果:
------------------------------------------------
请输入数 A: 66554433221100998877665544332211
请输入数 B: 11223344556677889900112233445566

66554433221100998877665544332211
+ 11223344556677889900112233445566
-----------------------------------------
77777777777778888777777777777777
温馨提示:答案为网友推荐,仅供参考
第1个回答  2006-12-28
楼主,楼上有两位仁兄提供的代码都有错。一旦输入的数字超出了32位,答案就是垃圾值。楼主不妨试试。另外为保证程序风格简约,也为了便于你阅读代码的时候直接进入核心部分,我没有加上那些提示输入的东西。也没有容错处理(如果你输入的字符串里面含有非数字,那我的程序的结果就是不可预料的)楼主要注意,写程序的时候不要一开始就陷入到容错处理中,那会给你后面你编写核心代码带来很多麻烦,最好的方法就是先写好核心代码,然后在尽量不变更核心代码的基础上再慢慢地添加一些容错处理机制。运行的时候你就直接输入就可以了,最后显示的就是结果,需要提示语句或者报错之类的,楼主自己加。这里提供两个版本。第一个版本如果输入超出了32位,那后面超出了的的低位上的数字被砍掉。第二个版本,如果输入超出了32位,超出的高位上的数字被砍掉。建议你用第二个版本,因为计算机内部采取的是这种方式。如果有不明白的地方尽管发消息问我。

/* Version 1. */

#include <stdio.h>

#define N 32

void
clear(void)
{
while ( getchar() != '\n' );
}

int
main(void)
{
char a[N], b[N], s[N+1] = { 0 };
int i;

for ( i = 0; i < N; i++ )
scanf( "%c", a+i );
clear();
for ( i = 0; i < N; i++ )
scanf( "%c", b+i );
clear();
for ( i = N; i > 0; i-- ) {
if ( (s[i]=a[i-1]+b[i-1]+s[0]-'0') > '9' ) {
s[0] = 1;
s[i] -= 10;
}
else
s[0] = 0;
}
if ( s[0] )
putchar( '1' );
for ( i = 1; i <= N; i++ )
putchar( s[i] );

getchar();
return 0;
}

/* version 2 */
#include <stdio.h>
#include <string.h>

#define N 32

void
clear(void)
{
while ( getchar() != '\n' );
}

void
operand(char * opd, char * buf)
{
int i, j;

/* buffer the input string */
scanf( "%s", buf );
clear(); /* clear stdin */

/* copy the digit string in buf to opd, truncating those high significant
digits of the digit string if its length exceeds the limit N */
for ( i = 0, j = strlen(buf)-N; i < N; i++, j++ )
opd[i] = buf[j];
}

int
main(void)
{
char buf[N*N], a[N], b[N], s[N+1] = { 0 };
int i;

/* get two operands */
operand(a, buf);
operand(b, buf);

/* key codes, addition */
for ( i = N; i > 0; i-- ) {
if ( (s[i]=a[i-1]+b[i-1]+s[0]-'0') > '9' ) {
s[0] = 1;
s[i] -= 10;
}
else
s[0] = 0;
}

/* show result */
if ( s[0] )
putchar( '1' );
for ( i = 1; i <= N; i++ )
putchar( s[i] );

putchar( '\n' );

getchar();
return 0;
}
第2个回答  2006-12-28
/*我做了一个,你看看,应该可以很容易懂得*/
/*原来做的是任意两个大数(小于50位的数)相加的*/
/*你这个只要求32位,所以也应该适合的*/
/*不过这段代码是有缺陷的,但你的要求来说,是满足要求的*/

#include<string.h>
#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);
}

/*具体情况,请参见以下网址*/
/**/
第3个回答  推荐于2017-09-21
#include<string.h>
#include<stdio.h>
#define M 33
void clear(void)
{
while ( getchar() != '\n' );
}
main(void)
{char a[M],b[M],c[M],d[M];
int ia,ib,ic,id,i;
printf("input a:");
scanf("%s",a);
if(strlen(a)>32)
{ printf("over!\n");
return 0; }
clear();
for(i=0;i<strlen(a);i++)
if(a[i]<'0' || a[i]>'9')
{printf("Error\n");
return 0;}
printf("\ninput b:");
scanf("%s",b);
if(strlen(b)>32)
{ printf("over!\n");
return 0;}
clear();
for(i=0;i<strlen(b);i++)
if(b[i]<'0' || b[i]>'9')
{printf("Error\n");
return 0;}
ia=strlen(a);
ib=strlen(b);
if(ia>ib)
{strcpy(c,a);
strcpy(d,b);
}
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);
}
ic=strlen(c);
id=strlen(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);
}

ok,祝你好运。本回答被提问者采纳
第4个回答  2006-12-28
main()
{
char a[32],b[32];c[32];
int i,j,k,c[32];
j=0

printf("input the number1:");
scanf("%s",&a);

printf("input the number2:");
scanf("%s",&b);

for(i=31;i>=0;i--)
{
c[i]=a[i]+b[i]-'0'-'0'+j;
if(c[i]>9)
{
c[i]=c[i]-10;
j=1;
}
else j=0;
if(i==0&&j=1) printf("1");
}
for(k=0;k<32;k++)
{
printf("%d",c[i])
}
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网