这是一个读者朋友在知识星球上提到的两个笔试题,第一个题目比较简单,关键在第二个题目「编程题」,我文章中写的解题思路应该不是最好的,希望大神读者们给出更好的答案,让这个充满乐趣的程序世界再增添一些乐趣吧,所以, show your code .
第一题,求如下输出
#include "stdio.h"#define m(x,y) (x)<(y)?x:y
int main()
{printf("%d\n",10*m(10,15));return 0;
}
如果是学生的话,建议先看看题目,然后心里默念一下再往下看答案,我知道是一个非常简单的题目,但是也不要掉以轻心。
输出:
15--------------------------------
Process exited after 0.2808 seconds with return value 0
请按任意键继续. . .
编程题
输入一个字符串 然后判断里面最多的字符是什么 大写小写都要独立计数。
#include "stdio.h"
#include "string.h"#define m(x,y) (x)<(y)?x:y
int main()
{int i=0,j=0,m=0;char s[100];char r[255];memset(r,0,sizeof(r));memset(s,0,sizeof(s));gets(s);m=strlen(s);printf("%d %s\n",m,s);for(i=0;i<m;i++){r[s[i]]++;//putchar(s[i]);}printf("\n----------\n");for(i=0;i<255;i++)printf("%d ",r[i]);printf("\n----------\n");for(i=0;i<255;i++){char tmp = 0;for(j=0;j<255-i;j++){if(r[i] > r[j]){tmp = r[j];r[j]=r[i];r[j]=r[i];}}}printf("\n----p------\n");for(i=0;i<255;i++)printf("%d ",r[i]);printf("\n----------\n");printf("%d\n",r[254]);return 0;
}
上面是一个读友提出的解决方案,不过我对这个方案不是很满意「主要觉得代码行数有点多」,冥思苦想之后,想了下面这个更愚蠢的办法
#include "stdio.h"
#include "string.h"
#include "stdint.h"int main(void)
{char s[100];uint16_t r[100];int m=0,i=0,j=0;uint8_t temp=0,max=0;memset(s,0,sizeof(s));memset(r,0,sizeof(r));gets(s);m = strlen(s);for(i=0;i<m;i++){for(j=0;j<m;j++){if( s[i] != ((r[j]>> 8)&0xFF) ) {if(r[j] == 0){r[j] = (s[i] << 8)&0xFFFF;r[j] += 0x0001;break;}}else{r[j] += 0x0001;break;}}}temp = r[0]&0xFF;for(i=0;i<m;i++){if(r[i] != 0)printf("%c:%d\n",r[i]>>8,r[i]&0xFF);if((r[i]&0xFF) > temp){temp = r[i]&0xFF;max = i;}}printf(">>>%c:%d\n",r[max]>>8,r[max]&0xFF);return (0);
}
我还是认为这不是最好的方案,然后在知识星球上有一个读者评论,我看了评论受到启发,又进化了一次。
这个思路和上面的第一段代码差不多,遍历字符串里面的每一个字符,因为字符是char 类型,所以字符的值和「0-255」是对应关系的,然后再判断相同字符,如果和「0-255」的某个位置相同,那么这个位置的数组的值就加1。
然后寻找最大只的时候,也要遍历一遍。
有个弊端,就是如果同时存在几个相同最多字符的时候,要如何把他们同时输出的问题,如果使用我第二个方法的话,可以比较容易修改。
代码如下:
#include "stdio.h"
#include "string.h"
#include "stdint.h"int main()
{uint8_t i=0,temp=0;uint8_t cos = 0;char s[100];char r[255];memset(r,0,sizeof(r));memset(s,0,sizeof(s));gets(s);i=strlen(s);printf("%d\n%s\n",i,s);for(i=0;i<strlen(s);i++){r[s[i]]++; }temp = r[0];cos = 0;for(i=0;i<sizeof(r);i++){if(r[i] > temp){temp = r[i];cos = i;} }printf("%d:%c:%d\n",cos,(char)cos,r[cos]);return 0;
}
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
嵌入式Linux
微信扫描二维码,关注我的公众号