第二十六题(不会)

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. dede上怎么让所有链接在新窗口打开

    网页的头部,添加:<base target="_blank"> <base target="_blank"> </head> ...

  2. C语言中access、_mkdir、sprintf、 fopen、fwrite函数

    int access(const char *filename, int amode); amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-. 这个函数还可以检查其它文件属 ...

  3. HTML5 规范

    1.内容类型(ContentType) HTML5扩展仍然为".html"或".htm",内容类型(ContentType)仍然为"text/html ...

  4. Bitbucket使用方法

    一.软件及SSH keys: 由于我的Bitbucket账号的邮箱及用户名与Github相同,所以SSH Public Keys可以用Github的,登录Bitbucket,悬浮在用户名boliqua ...

  5. eclips中增加对jar包的引用

    http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html

  6. Java SE 第二十三讲----static关键字and final关键字

    1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...

  7. C#开发COM组件供其他开发环境或工具调用介绍(转)

    由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点. 希望对刚接触这类型开发的朋友有所帮助,若有不足之处还 ...

  8. SparkSQL使用之Thrift JDBC server

    Thrift JDBC Server描述 Thrift JDBC Server使用的是HIVE0.12的HiveServer2实现.能够使用Spark或者hive0.12版本的beeline脚本与JD ...

  9. android 开发进阶自定义控件 类似 TextView

    开发自定义控件的步骤: 1. 继承View: 2.重写构造函数并构造方法中获得我们自定义的属性. 3. 重写onDraw, 4.重写onMeasure 等函数 一.自定义View的属性,首先在res/ ...

  10. JMeter简介

    #Jmeter简介JMeter是一个100%纯Java桌面应用,它是Apache组织的开放源代码项目,它是功能和性能测试的工具.JMeter可以用于测试静态或者动态资源的性能.JMeter有以下特性: ...