重庆大学的计算机专业工程硕士的入学考试“完成 "123"+"4567"="4690"的计算功能”(seakingx)

陈年椰子 2001-10-16 08:01:27
#include<stdio.h>
#include<string.h>
char *StrNumAdd(char *p1,char *p2);

int main(void)
{
char *s1="123",*s2="4567";
printf("\n=%s",StrNumAdd(s1,s2));
/* 输出为 = 4690*/
return 0;
}

/*完成 "123"+"4567"="4690"的计算功能*/
char *StrNumAdd(char *p1,char *p2)
{ char p3[201]="",*pi=p3;
int temp,flag = 0;
strrev(p1);strrev(p2);
while(*p1||*p2)
__在此处填一条语句__________
*pi='\0';
strrev(p3);
return p3;
}
...全文
2181 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
gawain 2001-10-18
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>
char *StrNumAdd(char *p1,char *p2);

static char p3[201]="";
int main(void)
{
char s1[30]="1208935",s2[30]="59870667";
printf("\n=%s",StrNumAdd(s1,s2));
/* 输出为 = 4690*/
return 0;
}

/*完成 "123"+"4567"="4690"的计算功能*/
char *StrNumAdd(char *p1,char *p2)
{
char *pi=p3;
strrev(p1);
strrev(p2);
while(*p1||*p2)
((*pi+=((( (*p1==0)?(*(p1++)+='0'):*p1++ ) + ((*p2==0)?(*(p2++)+='0'):*p2++ ))-'0'-10)) > ('9'-10) )? ( *((pi++)+1)=1):(*(pi++)+=10);
*pi='\0';
strrev(p3);
return p3;
}
public 2001-10-18
  • 打赏
  • 举报
回复
to longs(深蓝)
你是国外哪所名牌大学的研究生?
coldfire 2001-10-17
  • 打赏
  • 举报
回复
我在打工编程,这是我决定——明年毕业了打死我也不做编程——不是说编程不好,是我能力有限。
errorzhl 2001-10-17
  • 打赏
  • 举报
回复
很显然,这是故意装高深,要是我找人,这种人统统滚蛋
longs 2001-10-17
  • 打赏
  • 举报
回复
唉,国内大学的研究生,不读也罢...................
vhyn 2001-10-17
  • 打赏
  • 举报
回复
工程琐事?一帮大混子,都是拿着答案去考试的!
陈年椰子 2001-10-17
  • 打赏
  • 举报
回复
char *StrNumAddX(char *p1,char *p2)
{ char p3[201]="",*pi=p3+201,*pi1=p1,*pi2=p2;
int temp,flag = 0;
while(*pi1++); pi1-=2;
while(*pi2++); pi2-=2;
*pi--='\0';

while(pi1>=p1||pi2>=p2) *pi--=(temp = (pi1>=p1? (*pi1--)-'0':0)+(pi2>=p2? (*pi2--)-'0':0)+flag,flag = temp/10,temp%10+'0');
if (flag==1) *pi--='1';
if (temp=0,++pi!=p3) while(p3[temp++]=*pi++);
return p3;
}

char *StrNumAdd(char *p1,char *p2)
{ char p3[201]="",*pi=p3;
int temp,flag = 0;
strrev(p1);strrev(p2);
while(*p1||*p2)
*pi++=(temp = (*p1? *p1++-'0':0)+(*p2? *p2++-'0':0)+flag,flag = temp/10,temp%10+'0');
if (flag==1) *pi++='1';
*pi='\0';
strrev(p3);
return p3;
}





我的做法
parba 2001-10-17
  • 打赏
  • 举报
回复
不好意思 没想的全面 进位没有 :)
parba 2001-10-17
  • 打赏
  • 举报
回复
*(p3++)=*p1+*p2-30h
laotong 2001-10-17
  • 打赏
  • 举报
回复
骂没意义,谁能用简单的函数写一个?
hwang 2001-10-17
  • 打赏
  • 举报
回复
显然有一个隐含bug,p3应声明为static。
lwd2k 2001-10-17
  • 打赏
  • 举报
回复
可能太简单的用不着考吧。
moniker 2001-10-17
  • 打赏
  • 举报
回复
出题者真的很外行耶!
Nizvoo 2001-10-17
  • 打赏
  • 举报
回复
这个东西没点实用价值。
让他们去研究算法的人搞吧
Only_I 2001-10-16
  • 打赏
  • 举报
回复
*(++pi)=((char)(temp-flag*10+48),(flag=((temp>=10)?1:0)),
temp=((*p1?((int)(*(++p1))-48):0)+(*p2?((int)(*(++p2))-48):0)+flag))
hollysky 2001-10-16
  • 打赏
  • 举报
回复
当然这道题中的某些细节也体现作者编程思想的不成熟,我做了一点修改,如下:
char *StrNumAdd(char *p1,char *p2)
{
static char p3[201]="";//改用静态的
char *pi=p3;
int temp,flag = 0;
strrev(p1);strrev(p2);
while(*p1||*p2)
// __在此处填一条语句__________
// {
//temp = ((*p1)?*(p1++):'0') + ((*p2)?*(p2++):'0') - 2*'0' + flag;
//flag = (temp>=10?1:0);
//*pi++ = (temp>=10?temp-10:temp) + '0';
// }
*pi++ = (temp = ((*p1)?*(p1++):'0') + ((*p2)?*(p2++):'0') - 2*'0' + flag ) >=10? (flag =1,temp-10 + '0'):(flag = 0,temp + '0');
*pi='\0';
strrev(p3);
return p3;
}
int main(void)
{
char s1[]="654321",s2[]="87654321";//这里也体现编程思想
printf("\n=%s",StrNumAdd(s1,s2));
return 0;
}
hollysky 2001-10-16
  • 打赏
  • 举报
回复
大学是做理论研究的为重要,有理论上的突破实现也就容易
这是考功夫,不是做项目
可先分三步做,这样思路便很清晰(做项目一定要这样的要求)

//temp = ((*p1)?*(p1++):'0') + ((*p2)?*(p2++):'0') - 2*'0' + flag;
//flag = (temp>=10?1:0);
//*pi++ = (temp>=10?temp-10:temp) + '0';

然后按要求合并成一句
勉励前行 2001-10-16
  • 打赏
  • 举报
回复
while(*p1¦¦*p2)   
 {*pi = *p1 + *p2 - '0';
if(*pi > '9') {*(pi++) -=10; (*pi)--;} //這里錯了,該為(*pi)++;減十并向上進位。
else pi++;
}
hollysky 2001-10-16
  • 打赏
  • 举报
回复
*pi++ = (temp = ((*p1)?*(p1++):'0') + ((*p2)?*(p2++):'0') - 2*'0' + flag ) >=10? (flag =1,temp-10 + '0'):(flag = 0,temp + '0');
勉励前行 2001-10-16
  • 打赏
  • 举报
回复
seakingx:
//??while這個條件限制了通用性:654321+87654321會出錯!654321+7654321卻是對的。
//題目有錯呵。若題目給死只算123+4567的話,一句:return"4690";就搞定了,包對!哈..
while(*p1¦¦*p2)   
((*p1+*p2-'0')>'9')? (*(pi++) =(*(p1++)+*(p2++)-'0'-10),(*pi)++):(*(pi++) =(*(p1++)+*(p2++)-'0'));
不限一行語句,效率可高點:
while(*p1¦¦*p2)   
 {*pi = *p1 + *p2 - '0';
if(*pi > '9') {*(pi++) -=10; (*pi)--;}
else pi++;
}
這種考題?也未嘗不可。
但strrev不是ANSI C/C++函數,它只能在win32下運行,不好吧。
這個問題出在向上進位的處理上,
不用strrev,看seakingx(亚龙湾)的解決方法:
while(pi1>=p1¦¦pi2>=p2)
((*pi1+*pi2-'0')>'9')? (*(pi--) =(*(pi1--)+ *(pi2--)-'0'-10),(*pi)++) :
(*(pi--) =(*(pi1--)+ *(pi2--)-'0'));
我覺得沒什么改進.
加载更多回复(19)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧