前些天去企鹅刷笔试,现在回来整理一下
【1.】给出两个100位的数据,10进制,让写出算法求和并输出。当时稀里糊涂写了一通,结果很显然。。
#include <stdio.h>
#include <string.h>
#define RADIX 10
char* strrev(char* buf)
{
int i=0,len=0;
char tmp;
len=strlen(buf);
if(0==len)
return NULL; for(;i<len/2;i++)
{
tmp=buf[i];
buf[i]=buf[len-1-i];
buf[len-1-i]=tmp;
}
return buf;
}
char *add(char *ret, char *param1, char *param2)
{
int i = 0; /* ret 的索引 */
int carry = 0; /* 进位, 初始为0 */
char *p1 = strrev(param1);
char *p2= strrev(param2);
do
{
carry += (*p1 &0xf) + (*p2 &0xf);
ret[i++] = carry % RADIX + '0';
carry /= RADIX;
} while (*(++p1) && *(++p2)); /*指针先自增,后判断*/
ret[i]=carry;
while(*(++p1))/*如果p1里还有字符*/
{
if(ret[i]=='0')
ret[i++]= *p1;
else
ret[i++]+= *p1;
}
while(*(++p2))
{
if(ret[i]=='0')
ret[i++]= *p2;
else
ret[i++] += *p2;
}
ret[i] = '\0'; /*结束符*/
strrev(param1);
strrev(param2);
return strrev(ret);
} int main()
{
char first[255] = "12345678900000009234567890";
char second[255] = "12345678900000001234567890";
char ans[256]={0};
char*p=add(ans, first, second);
printf("ans=%s\np:%s\n", ans,p);
return 0;
}
大体的思路:将加数param1 及被加数param2以字符串存储,作为待处理主体,然后分别逆序字符串,将低位置前。while遍历同步记录进位。然后将结果再做逆序还原处理即可,这地方要注意当两个操作数中位数较短的数据遍历完后要记得处理这时有没有进位
【2.】填空如下让其输出Be the Best!
if(_______)
printf("Be ");
else
printf("the Best\n");
开始一看找不着头脑怎么实现功能。if或者else 其中之一是必须要走的,只能是else,至于为什么,我也讲不出原因,相信你也懂得。其实企鹅就是要考察if()以函数返回值作 条件。另外printf()输出是有返回值的,貌似是输出的字符长度(没具体查,回头有空可以查一下)。答案显然
if(!printf(“Be ”))
【3.】
printf("(int)(((int*)0)+4):%d (((int*)0)+4):%p\n",(int)(((int*)0)+4),(((int*)0)+4));
printf("(int)(((short*)0)+4):%d ((short*)0)+4):%p\n",(int)(((short*)0)+4),((short*)0)+4);
printf("(int)(((char*)0)+4):%d ((char*)0)+4):%p\n",(int)(((char*)0)+4),((char*)0)+4);
int iv=0x23456789;
char*cp=&(iv);
short *sp=&iv;
printf("cp: %#x %#x %#x %#x\n",cp[0],cp[1],cp[2],cp[3]);
printf("ret:%d\n",printf("sp: %#x %#x %#x %#x\n",sp[0],sp[1],sp[2],sp[3]));
执行输出:
(int)(((int*)0)+4):16 (((int*)0)+4):0x10
(int)(((short*)0)+4):8 ((short*)0)+4):0x8
(int)(((char*)0)+4):4 ((char*)0)+4):0x4
cp: 0xffffff89 0x67 0x45 0x23
sp: 0x6789 0x2345 0 0x3432
ret:27
分析无非就是 TYPE*(int*,short* ,char*)变量与普通数值相加时,基本操作单位是TYPE类型,这里可以把TYPE* 看做成TYPE的数组,这样子可以更容易理解。