刷笔试之企鹅

前些天去企鹅刷笔试,现在回来整理一下

【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的数组,这样子可以更容易理解。

 


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值