第二十六题(不会)

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题】的更多相关文章

  1. C puzzles详解【13-15题】

    第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...

  2. C puzzles详解【51-57题】

    第五十一题 Write a C function which does the addition of two integers without using the '+' operator. You ...

  3. C puzzles详解【46-50题】

    第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...

  4. C puzzles详解【38-45题】

    第三十八题 What is the bug in the following program? #include <stdlib.h> #include <stdio.h> # ...

  5. C puzzles详解【34-37题】

    第三十四题 The following times. But you can notice that, it doesn't work. #include <stdio.h> int ma ...

  6. C puzzles详解【31-33题】

    第三十一题 The following is a simple C program to read and print an integer. But it is not working proper ...

  7. C puzzles详解【21-25题】

    第二十一题 What is the potential problem with the following C program? #include <stdio.h> int main( ...

  8. C puzzles详解【16-20题】

    第十六题 The following is a small C program split across files. What do you expect the output to be, whe ...

  9. 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 ...

随机推荐

  1. iOS 热点、通话时候TabView的Frame调整

    - (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame{ ...

  2. Ubuntu 13.10 安装 ia32-lib

    Ubuntu 13.10下面不参直接安装ia32-libs,直接安装的时候会提示下面的信息: output$ sudo apt-get install ia32-libs Reading packag ...

  3. Redis使用详细教程(转)

    一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1.取最新N个数据的操作 2.排行榜应 ...

  4. Oracle中的单行函数

    Oracle中的单行函数 1 字符函数 UPPER()--将字符串转换为大写 SELECT UPPER('abc') FROM dual; LOWER()-将字符串转换为小写 SELECT LOWER ...

  5. jquery中各个事件执行顺序如下:

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  6. T450设置插入USB鼠标时自动禁用触摸板

    刚入手T450,打字时经常碰到触摸板,很是恼火,于是求助万能的度娘,找了卡饭基佬的教程,实测可行,大家可以试试.<win7下如何设置插入USB鼠标时自动禁用触摸板>,地址:www.kafa ...

  7. nyoj 97 兄弟郊游问题

    点击打开链接 兄弟郊游问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 兄弟俩骑车郊游,弟弟先出发,每分钟X米,M分钟后,哥哥带一条狗出发.以每分钟Y米的速度去追弟弟 ...

  8. jdk线程的简单使用

    一.线程的实现方式方式一:继承Thread类一个类只要继承了Thread类,并重写run()方法,则就可以实现多线程的操作. public class ThreadDemo01 { public st ...

  9. 翻译:Knockout 轻松上手 - 1 Knockout 是什么?

    原文名称:KnockoutJS Starter Knockout 是一个非常棒的脚本库,可是我发现许多人并不了解它,所以,思胜翻译了这本著作. 这一节,我们将会讨论 Knockout 可以做什么,又如 ...

  10. Android WebView Long Press长按保存图片到手机

    <span style="font-size:18px;">首先要先注册长按监听菜单 private String imgurl = ""; /** ...