C puzzles详解【26-30题】
第二十六题(不会)
- The following is a simple program which implements a minimal version of banner command available on most *nix systems. Find out the logic used in the program.
- #include<stdio.h>
- #include<ctype.h>
- char t[]={
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,,,,,,,,,,
- ,
- };
- int main(int argc,char** argv)
- {
- int r,pr;
- for(r=;r<;++r)
- {
- char *p=argv[];
- while(pr&&*p)
- {
- int o=(toupper(*p++)-'A')*++r;
- o=(o<||o>=sizeof(t))?:o;
- for(pr=;pr>=-;--pr)
- {
- printf("%c",( ( (pr>=) && (t[o]&(<<pr)))?'#':' '));
- }
- }
- printf("\n");
- }
- return ;
- }
第二十七题
- What is the output of the following program?
- #include <stdio.h>
- #include <stdlib.h>
- #define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))
- #define PrintInt(expr) printf("%s:%d\n",#expr,(expr))
- int main()
- {
- /* The powers of 10 */
- int pot[] = {
- ,
- ,
- ,
- };
- int i;
- for(i=;i<SIZEOF(pot);i++)
- PrintInt(pot[i]);
- return ;
- }
- 知识点讲解:
- 宏中的“#”
“#”将其后面的宏参数进行字符串化操作(stringfication),即对它所引用的宏变量通过替换后在其左右各加上一个双引号。更多关于宏中”#””##”的讲解见第五题。
- C语言中的二进制、八进制、十进制、十六进制数表示
以十进制数100为例:
二进制:C语言中无二进制数的表示方法;
八进制:以0开头,如0144;
十进制:以非0开头,如100;
十六进制:以0x开头,如0x64;
题目讲解:
输出为:
pot[i]:1
pot[i]:8
pot[i]:64
pot[i]:1000
PrintInt(pot[i])被替换为printf("%s:%d\n",“pot[i]”,pot[i]);
0001,0010,0100表示八进制数,1000表示十进制数。
第二十八题
- The following is the implementation of the Euclid's algorithm for finding the G.C.D(Greatest Common divisor) of two integers. Explain the logic for the below implementation and think of any possible improvements on the current implementation.
- BTW, what does scanf function return?
- #include <stdio.h>
- int gcd(int u,int v)
- {
- int t;
- while(v > )
- {
- if(u > v)
- {
- t = u;
- u = v;
- v = t;
- }
- v = v-u;
- }
- return u;
- }
- int main()
- {
- int x,y;
- printf("Enter x y to find their gcd:");
- while(scanf("%d%d",&x, &y) != EOF)
- {
- if(x > && y>)
- printf("%d %d %d\n",x,y,gcd(x,y));
- printf("Enter x y to find their gcd:");
- }
- printf("\n");
- return ;
- }
- Also implement a C function similar to the above to find the GCD of integers.
- 知识点讲解:
- 求最大公约数的三种算法
1)辗转相减法
- int gcd(int u, int v)
- {
- while()
- {
- if (u > v)
- {
- u -= v;
- }
- else if (u < v)
- {
- v -= u;
- }
- else
- {
- break;
- }
- }
- return u;
- }
2)辗转相除法
- int gcd(int u, int v)
- {
- int mod = ;
- if (u < v)
- {
- int temp = ;
- temp = u;
- u = v;
- v= temp;
- }
- while (v)
- {
- mod = u % v;
- u = v;
- v = mod;
- }
- return u;
- }
3)穷举法
- int gcd(int u, int v)
- {
- int min = ;
- int i = ;
- if (u > v)
- {
- min = v;
- }
- else
- {
- min = u;
- }
- for(i = min; i > ; i--)
- {
- if (u%i== && v%i==)
- {
- break;
- }
- }
- return i;
- }
- 求最小公倍数
两个数的最小公倍数=两个数的乘积/两个数的最大公约数
第二十九题
- What's the output of the following program. (No, it's not !!!)
- #include <stdio.h>
- #define PrintInt(expr) printf("%s : %d\n",#expr,(expr))
- int main()
- {
- int y = ;
- int *p;
- p = malloc(sizeof(int));
- *p = ;
- y = y/*p; /*dividing y by *p */;
- PrintInt(y);
- return ;
- }
题目讲解:
’/*’会被当成注释处理,所以
y = y/*p; /*dividing y by *p */;
等效于
y = y;
所以运行结果为
y: 100
第三十题
- The following is a simple C program to read a date and print the date. Run it and explain the behaviour
- #include <stdio.h>
- int main()
- {
- int day,month,year;
- printf("Enter the date (dd-mm-yyyy) format including -'s:");
- scanf("%d-%d-%d",&day,&month,&year);
- printf("The date you have entered is %d-%d-%d\n",day,month,year);
- return ;
- }
题目讲解:
scanf函数的定义为:
- int scanf(const char *format,…);
scanf会按照format指定的形式从标准输入读入数据到变量中。
如
- scanf("%d-%d-%d",&day,&month,&year);
当标准输入为“1-2-3”时,day=1,month=2,year=3;
当标准输入为“1,2,3”时,day=1,month和year为随机值。
C puzzles详解【26-30题】的更多相关文章
- C puzzles详解【13-15题】
第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...
- C puzzles详解【51-57题】
第五十一题 Write a C function which does the addition of two integers without using the '+' operator. You ...
- C puzzles详解【46-50题】
第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...
- C puzzles详解【38-45题】
第三十八题 What is the bug in the following program? #include <stdlib.h> #include <stdio.h> # ...
- C puzzles详解【34-37题】
第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...
- C puzzles详解【31-33题】
第三十一题 The following is a simple C program to read and print an integer. But it is not working proper ...
- C puzzles详解【21-25题】
第二十一题 What is the potential problem with the following C program? #include <stdio.h> int main( ...
- C puzzles详解【16-20题】
第十六题 The following is a small C program split across files. What do you expect the output to be, whe ...
- C puzzles详解【9-12题】
第九题 #include <stdio.h> int main() { float f=0.0f; int i; ;i<;i++) f = f + 0.1f; if(f == 1.0 ...
随机推荐
- Salted Password Hashing
Here are some examples of poor wacky hash functions I've seen suggested in forums on the internet. m ...
- substr
substr(string,start,length) string - 指定的要截取的字符串 start - 必需,规定在字符串的何处开始 正数 - 在字符串的指定位置开始 负数 - 在从字符串结尾 ...
- 将access数据库导入mysql
一般地,直接在mysql端,导入时选择access文件就行:但是若access数据库版本太老,导入mysql时会出错: 这时,就需要借助access 2003,对原始数据进行转换为2003版本数据,即 ...
- js中表单提交后按钮变灰色的功能
表单提交后按钮变成灰色 http://www.111cn.net/wy/js-ajax/45299.htm
- angularjs ng-select ng-options 默认选中项.
<!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="utf- ...
- spring mvc中的json整合
spring mvc整合过程中是有版本兼容的问题.具体的哪个版本的springmvc和哪个个版本的json包冲突我也无从考证了.我用的springmvc版本是3.2.1jaskson的版本是 1.1. ...
- ubuntu 永久设置dns信息
ubuntu 自从12.04后,会自动刷写 /etc/resolv.conf 文件,导致写入的dns信息会在重启的时候丢失. ============================ 转自:http: ...
- Dubbo 应用容器
Dubbo的容器模块,是一个独立的容器,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务. 服务容器只是一个简单的Main方法,并加载一个简单的Spring容 ...
- 11gR2 Clusterware and Grid Home - What You Need to Know
11gR2 Clusterware Key Facts 11gR2 Clusterware is required to be up and running prior to installing a ...
- FPS学习记录
最近在网上查了一些FPS的相关知识,在此和大家一起分享.FPS(Frames Per Second):每秒传输帧数,它是图像领域中的一个术语. Frames Per Second更确切的解释是“每秒中 ...