文档库 最新最全的文档下载
当前位置:文档库 › 趣味C语言题

趣味C语言题

趣味C语言题
趣味C语言题

韩信点兵

在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:按从1至5报数,记下最末一个士兵报的数为1;

再按从1至6报数,记下最末一个士兵报的数为5;

再按从1至7报数,记下最末一个士兵报的数为4;

最后按从1至11报数,最末一个士兵报的数为10;

你知道韩信至少有多少兵?(答案:2111)

黑洞数495与6174

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个数字不全相同的三位数,经有限次“重排求差”操作,总会得到495.最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数)

例如,对三位数207:

第1次重排求差得:720-027=693;

第2次重排求差得:963-369=594;

第3次重排求差得:954-459=495;

以后会停留在495这一黑洞数。

如果三位数的3个数字全同,一次转换后即为0.因而,可把0与495一并作为判断条件。试求出任意输入三位数重排求差的过程。

梅森尼数

形如2n-1的素数称为梅森尼数(Mersenne Prime)。例如22-1=3、23-1=7都是梅森尼数。1722年,双目失明的瑞士数学大师欧拉证明了231-1=2147483647是一个素数,堪称当时世界上“以知最大素数”的一个记录。

试求出指数n<20的所有梅森尼数。(答案共7个)

婚礼上的谎言

三对情侣参加婚礼,三个新郎为A,B,C,三个新娘为X,Y,Z,有人想知道究竟谁和谁结婚,于是就问新人中的三位,得到如下的提示:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人事后知道他们在开玩笑,说的全是假话,那么究竟谁与谁结婚呢?

魔术师的秘密

在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面

朝下,对观众说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,

将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌

子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,准确无误。现在的问题是,魔术师手中牌的原始顺序是怎样的?

约瑟夫问题

这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸

免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止.问怎样排法,才能使每次投入大海的都是非教徒.

常胜将军

现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一楰火柴谁输.请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为"常胜将军".

求100到1000之间有多少个其数字之和为5的整数.

(答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500)

打鱼还是晒网scanf(“%d%d%d”,&year ,&month,&day);

中国有句俗语叫"三天打鱼两天晒网".某人从1990年1月1日起开始"三天打鱼两天晒网",问这个人在以后的某一天中是"打鱼"还是"晒网".

*思考题:请打印出任意年份的日历

*运行结果

Enter year/month/day:1991 10 25

He was fishing at day.

Enter year/month/day:1992 10 25

He was sleeping at day.

Enter year/month/day:1993 10 25

He was sleeping at day.

求具有abcd=(ab+cd)2性质的四位数

3025这个数具有一种独特的性质:将它平分为二段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025本身.请求出具有这样性质的全部四位数.

*运行结果

There are following numbers with 4 digits satisfied condition:

2025 3025 9801

填数字游戏

已知下面的算式:ABCD

× E

DCBA 计算ABCDE取什么值?Sum

求车速

一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859.两小时后里程

表上出现了第二个新的对称数.问该车的速度是多少新的对称数是多少?

谁在说谎

张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎.现在问:这三人中到底谁说的是真话,谁说的是假话

*运行结果

Zhangsan told a lie (张三说假话)

Lisi told a truch. (李四说真话)

Wangwu told a lie. (王五说假话)

谁是窃贼

公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的.在回答公安人员的问题中:

甲说:"乙没有偷,是丁偷的."

乙说:"我没有偷,是丙便的."

丙说:"甲没有偷,是乙偷的."

丁说:"我没有偷."

请根据这四人的答话判断谁是盗窃者.

*运行结果The thief is B. (乙为窃贱.)

爱因斯坦的数学题

爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶.只有每次跨7阶,最后才正好一阶不剩.请问这条阶梯共有多少阶?119

角谷猜想

猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为 1.请编程验证.

10个小孩分糖果

十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块.然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块.问经过这样几次后大家手中的糖的块数一样多每人各有多少块糖 ?

*运行结果

child

r 1 2 3 4 5 6 7 8 9 10

0 10 2 8 22 16 4 10 6 14 20

1 15 6 5 15 19 10 7 8 10 17

2 17 11 6 11 18 15 9 8 9 14

3 16 15 9 9 15 17 13 9 9 12

4 14 16 13 10 13 17 16 12 10 11

5 13 15 15 12 12 1

6 1

7 14 11 11

6 13 15 16 14 12 14 1

7 16 13 12

7 13 15 16 15 13 13 16 17 15 13

8 14 15 16 16 15 14 15 17 17 15

9 15 15 16 16 16 15 15 17 18 17

10 17 16 16 16 16 16 16 17 18 18

11 18 17 16 16 16 16 16 17 18 18

12 18 18 17 16 16 16 16 17 18 18

13 18 18 18 17 16 16 16 17 18 18

14 18 18 18 18 17 16 16 17 18 18

15 18 18 18 18 18 17 16 17 18 18

16 18 18 18 18 18 18 17 17 18 18

17 18 18 18 18 18 18 18 18 18 18

委派任务

某侦察队接到一项紧急任务,要求在A,B,C,D,E,F六个队员中尽可能多地挑若干人,但有以下限制条件:

1)A和B两人中至少去一人;

2)A和D不能一起去;

3)A,E和F三人中要派两人去;

4)B和C都去或都不去;

5)C和D两人中去一个;

6)若D不去,则E也不去.

问应当让哪几个人去

*运行结果

A will be assigned. (去)

B will be assigned. (去)

C will be assigned. (去)

D will not be assigned. (不去)

E will not be assigned. (不去)

F will be assigned. (去)

哪个大夫哪天值班

医院有A,B,C,D,E,F,G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天.现在已知:

A大夫比C大夫晚一天值班;

D大夫比E大夫晚二天值班;

B大夫比G大夫早三天值班;

F大夫的值班日在B和C大夫的中间,且是星期四;

请确定每天究竟是哪位大夫值班

*运行结果

Doctor E is on duty MONDAY. (星期一:E)

Doctor B is on duty TUESDAY. (星期二:B)

Doctor D is on duty WEDNESDAY. (星期三:D)

Doctor F is on duty THUESDAY. (星期四:F)

Doctor G is on duty FRIDAY. (星期五:G)

Doctor C is on duty SATURDAY. (星期六:C)

Doctor A is on duty SUNDAY. (星期日:A)

谁家孩子跑最慢

张王李三家各有三个小孩.一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得9分,跑第2得8分,依此类推.比赛结果各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次.已知获第一名的是李家的孩子,获得第二的是王家的孩子.问获得最后一名的是谁家的孩子

*运行结果

7 5 3

8 6 1

9 4 2

The last 王.

1~9分成1:2:3的三个3位数

将1到9 这九个数字分成三个3位数,求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍.问应当怎样分法.

*运行结果

No.1:192 384 576

No.2:219 438 657

No.3:273 546 819

No.4:327 654 981

分油趣题

从大容器往外倒一定体积的液体也是中外古代数学家喜爱研究的一类问题,如下面这

道厨师分油的趣题:“有一位厨师要从盛12斤油的桶中倒出6斤油来,可是手边只有盛5 斤油和盛8斤油的两个桶,问如何操作才能将6斤取出来呢?”

拉丁方

构造 NXN 阶的拉丁方阵(2<=N<=9),使方阵中的每一行和每一列中数字1到N只出现一次.如N=4时:

1 2 3 4

2 3 4 1

3 4 1 2

4 1 2 3

1黑与白

有A,B,C,D,E五个人,每人额头上都贴了一张或黑或白的纸条。五人对坐,每人都可以看到其它人额头上纸条的颜色,但不知道自己额头上纸条的颜色,五人相互观察后----

A说:“我看见三个人额头上贴白纸条,一人贴黑纸条”

B说:“我看见四人额头上都贴黑纸条。“

C说:“我看见三个人额头上贴黑纸条,一人贴白纸条。”

D说:“我看见四人头上都贴白纸条。”

E什么也没有说。

已经知道额头贴黑纸条的人说的是假话,额头贴白纸条的人说的是真话。问究竟谁的额头贴白纸条,谁的额头贴黑纸条?

2 要求输入一个数字N,然后打印一个数字绕的圈。

例如:N=3,然后输出:

1 2 3

8 9 4

7 6 5

N=4

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

依次例推。。。

要求用数组和循环实现。

有A,B,C,D,E五个人,每人额头上都贴了一张或黑或白的纸条。五人对坐,每

人都可以看到其它人额头上纸条的颜色,但不知道自己额头上纸条的颜色,五人相互观察后----

A说:“我看见三个人额头上贴白纸条,一人贴黑纸条”

B说:“我看见四人额头上都贴黑纸条。“

C说:“我看见三个人额头上贴黑纸条,一人贴白纸条。”

D说:“我看见四人头上都贴白纸条。”

E什么也没有说。

已经知道额头贴黑纸条的人说的是假话,额头贴白纸条的人说的是真话。问究竟谁的额头贴白纸条,谁的额头贴黑纸条?

我们用a,b,c,d,e表示每个人额头上所贴纸条的颜色,0代表黑色,1代表白色。

由于暂时无法判定究竟谁说的是真话,因此每个人的话都有对错二种可能。以A 说

的话为例:假设A贴的是白纸条,寻么A说实话,有:

a&&b+c+d+e==3

假如A贴的是黑纸条,那么A说假话,有:

!a&&b+c+d+e!=3

因此根据A的回答,可以得到如下结论:

a&&b+c+d+e==3||!a&&b+c+d+e!=3

同样由b,c,d的回答,有如下结论:

b&&a+c+d+e==0||!b&&a+c+d+e!=0

c&&a+b+d+e==1||!c&&a+b+d+e!=1

d&&a+b+c+e==4||!d&&a+b+c+e!=4

与上例一样,让计算机穷举所有可能的情形,代入上述表达式进行推理运算,假如

满足上述表达式为真,说明找到了正确答案。

代码如下:

main()

{

int a,b,c,d,e;

for(a=0;a<=1;a++)

for(b=0;b<=1;b++)

for(c=0;c<=1;c++)

for(d=0;d<=1;d++)

if(a&&b+c+d+e==3||!a&&b+c+d+e!=3)

&&(b&&a+c+d+e==0||!b&&a+c+d+e!=0)

&&(c&&a+b+d+e==1||!c&&a+b+d+e!=1)

&&(d&&a+b+c+e==4||!d&&a+b+c+e!=4))

{ printf("A is pasted %s.\n",a?"white":"black"); printf("B is pasted %s.\n",b?"white":"black"); printf("C is pasted %s.\n",c?"white":"black");

printf("D is pasted %s.\n",d?"white":"black"); printf("E is pasted %s.\n",e?"white":"black"); }

}

魔术师的秘密

在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面

朝下,对观众说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,

将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数

1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌

子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,

这样依次将13张牌翻出,准确无误。现在的问题是,魔术师手中牌的原始顺序是怎样的?

解决这类问题的要害在于利用倒推的方法推出原来牌的顺序。

假设桌上摆着13个空盒子,编号为1至13,将黑桃A放入第一个盒子中,从

下一个空盒

子开始对空盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个

空盒子开始对空盒子计数。顺序放入3,4,5等,直到全部放入13张牌,注重在计数时要

跳过非空的盒子,只对空盒子计数,最后得到的牌在盒子中的顺序,就是魔术师手中原

来牌的顺序。

计算机就是模拟这种行之有效的倒推方法的。

代码如下:

#include

int a[14];

main()

{

int i,n,j=1;

printf("The orginal order of cards is:\n");

for(i=1;i<=13;i++) /*i为空盒子的顺号*/

{ n=1;

do

{ if(j>13)j=1;

if(a[j])j++;

else

{ if(n==i)a[j]=i;

j++;

n++;

}while(n<=i);

}

for(i=1;i<=13;i++)

printf("%2d,",a[i]);

}

分油趣题

从大容器往外倒一定体积的液体也是中外古代数学家喜爱研究的一类问题,如下面这

道厨师分油的趣题:“有一位厨师要从盛12斤油的桶中倒出6斤油来,可是手边只有盛5

斤油和盛8斤油的两个桶,问如何操作才能将6斤取出来呢?”

我们首先用字母a,b,c代表12斤桶,8斤桶和5斤捅。规定倒油的顺序为:

a->b->c->a

并且必须符合如下规则:

1.b(8斤桶)倒空后才能从a(12斤桶)中取油。

2.c(5斤桶)盛满后才能向a(12斤捅)中倒油。

我们设从a中往b倒油x次,从c往a倒油y次,那么最后a中剩下的油应该为12-

8x+6y斤,按照题意,我们得到如下方程,

12-8x+6y=6:

我们为了得到这个方程的解,应按照上述的倒油规则不断的倒下去,直到a 中或b中

油的重量为6斤为止,另外也可以改变倒油的规则,看能否找到最好的倒油步聚。代码:

#include

int i;

main()

{ int a,y,z;

printf("Input Full a ,Empty b,c,Get i:"); /*读入3个容器的容量和最后需要的数量*/

scanf("%d%d%d",&a,&y,&z,&i);

getti(a,y,z);

}

getti(int a,int y,int z)

{ int b=0,c=0; /*b,c为二个容器的实际重量*/

printf("a%d b%d c%d\n%4d%4d%4d\n",a,y,z,a,b,c);

while(a!=i||b!=i) /*假如满足要求退出循环*/

{ if(!b) /*假如b为空,从a往b倒油*/

{ a-=y;b=y;

}

else if(c==z)

{ a+=z;c=0 /*假如c已满,从c往a倒油*/

}

else if(b>z-c)

{ b-=(z-c);c=z; /*假如b的重量大于c的剩余重量,倒满c*/ }

else

{ c+=b;b=0; /*否则将b中的油全部倒入c*/

}

printf("%4d%4d%4d\n",a,b,c);

}

}

要求输入一个数字N,然后打印一个数字绕的圈。

例如:N=3,然后输出:

1 2 3

8 9 4

7 6 5

N=4

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

依次例推。。。

要求用数组和循环实现。

分析:螺旋巨阵问题

楼主可以这样去考虑找出这个数组的规律

思路:

第一:输出第一行的所有列

第二:输出每一行的最后一列

第三:输出每一列的最后一行

第四:输出第一列的所有行

四步做完之后再去考虑它的内向循环依次减一就可以了

总的循环次数是行或列的一半

因为当N 是奇数的时候才需要填充(N/2)+1 次,N是偶数的时候只要填充(N/2)次,

i是从0开始的,所以不需要等于i <=N/2。

int i,j,n=1,a[N][N];

// 每次顺时针填充一个“口”字型。假设分为X轴Y轴坐标

for (i=0; i

{

for (j=i; j

a[i][j] = n++;

}

for (j=i+1; j

a[j][N-i-1] = n++;

}

for (j=N-i-2; j> i; j--) // 往左填充,X保持,Y-- {

a[N-i-1][j] = n++;

}

for (j=N-i-1; j> i; j--) // 往上填充,Y保持,X-- {

a[j][i] = n++;

}

}

for (i=0; i

{

printf( "\n\n ");

for(j=0; j

{

printf( "%5d ",a[i][j]);

}

}

谁是贼?

甲说:”乙没有偷,是丁偷的。”B+D=1

乙说:“我没有偷,是丙偷有。”B+C=1

丙说:“甲没有偷,是乙偷的。”A+B=1

丁说:“我没有偷。”A+B+C+D=1

计算机C语言趣味的程序设计——题目百例

Contest - 2011级C语言课程大作业 Start Time: 2012-02-19 16:25:00 End Time: 2012-03-01 22:00:00 Current Time: 2012-2-23 15:51:18 Status:Running Public

写在最前: 本文档中的题目;在不不同的编译器中可能会有提示错误,呵呵,小小的动动手改下变量的定义就可以运行了……………….. 由于能力不足..有题目未解决的…或者有错误的我会…认真听取大家的..意见的…. 呵呵……..有一两个….偷了下懒哦……… 提供原题目还有本人自己的解答的源代码。感谢大家的。。。。建议……………. 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。

样例输入 10 8 15 样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++;

c语言趣味编程实例

1、编程序求5X+2Y+Z=50 的所有非负整数解。 #include int main() { int x, y, z; int count = 0; for (x = 0; 5 * x <= 50;x++) for (y = 0; 2 * y <= 50; y++) for (z = 0; z <= 50; z++) { if (5 * x + 2 * y + z == 50) { count++; printf("%d :", count); printf("x=%d,y=%d,z=%d", x, y, z); printf("\n"); } } return 0; } 2、把25个字母A、B、C、···、X、Y按如下要求打印出来:从最中间的字母M 开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。 要求:初始化时按字母表顺序赋值。 #include int main() { char x[] = "ABCDEFGHIJKLMNPQRST"; int k; int n = 0; while (x[n]) { n++; if (x[n] == 'M') { k = n;break; } } printf("%c,",x[k]); for (int i = 1; i <= 12; i++) if (i <= 11) printf("%c,%c,", (x[k] - i), (x[k] + i)); else printf("%c,%c。", (x[k] - i), (x[k] + i)); printf("\n");

C语言经典编程

猴子吃桃 1、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: main() { int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day--; } printf("the total is %d\n",x1); } 回文数问题 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法) 2.程序源代码: main( ) { long a,b,c,d,e,x; scanf("%ld",&x); a=x/10000;/*分解出万位*/ b=x%10000/1000;/*分解出千位*/ c=x%1000/100;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a); else if (b!=0) printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b); else if (c!=0) printf(" there are 3,%ld %ld %ld\n",e,d,c); else if (d!=0) printf("there are 2, %ld %ld\n",e,d); else if (e!=0) printf(" there are 1,%ld\n",e); } 杨辉三角 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1

CC语言趣味程序设计编程百例精解

C-C++语言趣味程序设计编程百例精解() ?81.角谷猜想 日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。请编程验证。 *问题分析与算法设计 本题是一个沿未获得一般证明的猜想,但屡试不爽,可以用程序验证。题目中给出的处理过程很清楚,算法不需特殊设计,可按照题目的叙述直接进行证。 *程序说明与注释 #include<stdio.h> int main() { int n,count=0; printf("Please enter number:"); scanf("%d",&n); /*输入任一整数*/ do{ if(n%2)

n=n*3+1; /*若为奇数,n乘3加1*/ printf("[%d]:%d*3+1=%d\n",++count,(n-1)/3,n); } else { n/=2; /*若为偶数n除以2*/ printf("[%d]: %d/2=%d\n",++count,2*n,n); } }while(n!=1); /*n不等于1则继续以上过程*/ } 82.四方定理 数论中著名的“四方定理”讲的是:所有自然数至多只要用四个数的平方和就可以表示。 请编程证此定理。 *问题分析与算法设计 本题是一个定理,我们不去证明它而是编程序验证。 对四个变量采用试探的方法进行计算,满足要求时输出计算结果。 *程序说明与注释 #include<stdio.h> #include<stdlib.h> int main()

C语言编程练习题绝对经典!

马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人 解方程组 编写程序,采用穷举法求出结果。 编写程序,根据以下公式求e 的值。要求用两种方法计算: 1) for 循环,计算前50项 2)while 循环,直至最后一项的值小于10-4 从键盘中输入一个数字(不限位数),用循环语句编程判断并输出这个数字的位数。 猴子吃桃子问题。猴子第一天摘下若干个桃,当即只一半,又多吃一个。第二天早上又将剩下的一半吃掉一半,双多吃一个。以后每天早上都吃了前天剩下的一半零一个,到第10天早上 只剩下最后一个桃。问第一天摘了几个桃。 编程打印九九乘法表 青年歌手参加歌曲大奖赛,有10个评委打分,试编程求选手的平均得分(去掉一个最高分和一个最低分)。 从键盘中输入一个数字(可以包含小数点,其位数在60位以下,求其整数的有效位数,如输入,返回值为整数有效位数为3) 1) 输入数据为浮点型,不用数组,不用字符串,只有变量的算术运算实现此功能。 2) 使用数组来进行编程。 使用数组,编写一个十进制正整数转换为任意进制数的转换工具。 (大进制向小进制的转换。(方法是相除去余) 10进制327转八进制: 327/8 = 40 余数为7 40/8 = 5 余数为0 于是八进制数为507(第一位5是最后的商)) 使用数组,编写一个任意进制正整数转换为十进制的转换工具。(以2,10进制互转为例,其他请举一反三: 二进制数1101转十进制: 1×2的三次幂+1×2的二次幂+0×2的一次幂+1×2的零次幂=8+4+0+1=13) 10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2,8,22,16,4,10,6,14,20。然后按下列规则调整,所有小孩同时把自己的糖果分一半给右边的小孩,糖块数变为 奇数的人,再向老师补要一块,问经过多少次调整后,大家的糖块一样多,且每人多少块。 11111111!2!3!4!5!!e n ≈++++++??????+

趣味c语言编程100例

趣味 c 语言编程100 例 【程序 1】 题目:有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、 2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) / *以下为三重循环 */ for( j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /* 确保 i 、 j、 k 三位互不相同 */ printf("%d,%d,%d\n",i,j,k); } } 程序 2】 题目:企业发放的奖金根据利润提成。利润 (I) 低于或等于 10 万元时,奖金可提 10% ;利润高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元的部分,可可提成 7.5% ; 20 万到 40 万之间时,高于 20 万元的部分,可提成 5% ; 40 万到 60 万之间时高于

40 万元的部分,可提成 3% ;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5% ,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总 数? 1. 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2. 程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03;

复试C语言常考趣味程序设计

狼追兔子 1 巧夺偶数 2 五猴分桃 3 高次方数 4 借书方案 5 过桥问题 6 数制转换7 打渔晒网8 喝酒问题9 哥德巴赫猜想10 打印日历11 抓交通肇事逃逸犯12 反序数13 新郎新娘14 称重砝码15 求车速16 谁是窃贼17 出售金鱼18 百钱百鸡19 谜语博士20 猜牌术(-)21 舍罕王的失算22 怎样存钱利最大23 猜牌术(二)24 爱因斯坦的数学题25 取火柴游戏26 平分鱼和筐27 可逆素数28 三色球问题29 抢n游戏30 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。 样例输入 10 8 15

样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++; } else printf("%d",i); } printf("\n"); } return 0; } 问题B: 趣味程序设计_巧夺偶数 时间限制: 1 Sec 内存限制: 128 MB

C语言趣味程序设计编程100例精解

C/C++语言经典、实用、趣味程序设计编程百例精解(1) 1.绘制余弦曲线 在屏幕上用―*‖显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个―*‖。 为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。程序中利用反余弦函数acos计算坐标(x,y) 的对应关系。 使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序说明与注释 #include #include int m ain() { double y; int x,m; for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/ { m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/ for(x=1;x

有趣的C语言笔试题

有趣的C语言笔试题 1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf(" The buffer entered is[%s] ",buff); return 0; } 答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。 2.strcpy()函数 问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗? #include int main(int argc,char*argv[]) { int flag=0; char passwd[10]; memset(passwd,0,sizeof(passwd)); strcpy(passwd,argv[1]); if(0==strcmp("LinuxGeek",passwd)) { flag=1; }

if(flag) { printf(" Password cracked "); } else { printf(" Incorrect passwd "); } return 0; } 答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如: $./psswd aaaaaaaaaaaaa Password cracked 虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。 要避免这样的问题,建议使用strncpy()函数。 作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。 3.main()的返回类型 问:下面的代码能编译通过吗?如果能,它有什么潜在的问题吗? #include void main(void) { char*ptr=(char*)malloc(10); if(NULL==ptr) {

趣味C语言题

韩信点兵 在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数: 按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按从1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 你知道韩信至少有多少兵?()z谁结婚呢? 魔术师的秘密 在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面 朝下,对观众说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一, 将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数 1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌 子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3, 这样依次将13张牌翻出,准确无误。现在的问题是,魔术师手中牌的原始顺序是怎样的? 约瑟夫问题 这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸 免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止.问怎样排法,才能使每次投入大海的都是非教徒.

求车速 一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859.两小时后里程 表上出现了第二个新的对称数.问该车的速度是多少新的对称数是多少? 常胜将军 现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输.请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为"常胜将军". 十进制转换成N进制(N=2 8 16 ) 定义一个方法Trans(int num, int regx) 实现将一个输入十进制数num转换成regx 进制 Eg: Trans(100, 16) 表示将 100 转成 16进制数输出 求100到1000之间有多少个其数字之和为5的整数. (答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500) 打鱼还是晒网scanf(“%d%d%d”,&year ,&month,&day); 中国有句俗语叫"三天打鱼两天晒网".某人从1990年1月1日起开始"三天打鱼两天晒网",问这个人在以后的某一天中是"打鱼"还是"晒网". *思考题:请打印出任意年份的日历 *运行结果 Enter year/month/day:1991 10 25

使用C语言编写简单小游戏

纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘on line》.它是e 时代常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式 .作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1,总是从Hello,world开始学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!".让我们来看看这个最简单的C程序: #incolude /*把输入输出函数的头文件包含进来*/ int main() { printf("Hello, world!");/*在屏幕上输出字符串"Hello,world!"*/ return 0;/*退出main函数,并返回0*/ } 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧! 1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf("%c", 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧! 2,心动的开始,一个运动中的笑脸大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构: struct move_point { int x, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/ }; 运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码: gotoxy(man.x, man.y);/*把光标移到指定的坐标*/ printf(" ");/*输出一个空格,把先前的字符擦去*/ 然后我们让物体按其速度运动: man.x += man.xv;/*水平方向按x轴的速度运动*/ man.y += man.yv;/*垂直方向按y轴的速度运动*/ 运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸: gotoxy(man.x, man.y); printf("%c\b", 2); /*输出ASCII码值为2的"笑脸"字符*/ 怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧! 3,交互的实现——让我们来控制笑脸运动 这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句: while (bioskey(1) == 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/ 然后用switch语句来判断按键以及执行相关操作,如下: switch (key) /*对变量key的值进行判断*/ { case UP: /*如果按的是向上键*/ … break; /*让物体向上运动,并退出switch*/

c语言趣味程序

c语言趣味程序 导读:就爱阅读网友为您分享以下“c语言趣味程序”的资讯,希望对您有所帮助,感谢您对https://www.wendangku.net/doc/456374495.html,的支持! 每个数都是质数。完全可以采用穷举的方法对乘数和被乘数进行穷举,经过判断后找出答案。但是这种方法给人的感觉是“太笨了”,因为组成的数字只是质数(4个),完全没有必要在那么大的范围内进行穷举,只需要试探每一位数字为质数时的情况即可。采用五重循环的方法实现对于5个数字的穷举,前面的许多例题中都已见过。循环实现简单易行,但嵌套的层次太多,需要穷举的变量的数量直接影响到循环嵌套的层数,这种简单的实现方法缺少技巧性。本例的程序中给出了另外一种同样功能的算法,该算法的实现思想请阅读程序。程序中并没有直接对质数进行穷举,而是将每个质数与1到4顺序一一对应,在穷举时为处理简单仅对1到4进行穷举处理,待要判断产生的乘积是否满足条件时再利用一个数组完成向对应质数的转换。请体会程序中的处理方法。程序中使用的算法实际上是回朔法。*程序说明与注释#include<stdio.h>#define NUM 5 /*需要穷举的变量数

目*/#define C_NUM 4 /*每个变量的值的变化范围*/int a[NUM+1]; /*为需要穷举的变量开辟的数组*//*a[1]:被乘数的百位,a[2]:十位,aa[3]:个位a[4]:被乘数的十位a[5]:个位*/int b[]={0,2,3,5,7}; /*存放质数数字的数组,不使用第0号元素*/int f(long sum);int main(){int i,not_finish=1;i=2; /*i:将要进行处理的元素的指针下标。设置初始值*/a[1]=1; /*为第1号元素设置初始值*/while(not_finish) /*not_finish:程序运行没结束标记*/{while(not_finish&&i<=NUM)/*处理包括第i 个元素在内的后续元素,找出当前条件下的一种各个变量的一种可能的取值方法*/if(a>=C_NUM) /*当要处理的元素取超过规定的C_NUM时*/if(i==1&&a[1]==C_NUM)not_finish=0; /*若1号元素已经到C_NUM,则处理全部结束*/else a[i–]=0; /*将要处理的元素置0,下标-1(回退一个元素)*/else a[i++]++; /*当前元素值加1后下标指针加1*/if(not_finish){long int sum1,sum2,sum3,sum4; /*定义临时变量*/sum1=b[a[1>*100+b[a[2>*10+b[a[3>; /*计算被乘数*//*利用数组的下标与质数的对应关系完成序号1到4向质数的转换*/sum2=sum1*b[a[5>; /*计算乘数个位与被乘数的部分积*/sum3=sum1*b[a[4>; /*计算乘数十位与被乘数的部分积

C语言程序题

1.素数 [100,999]范围内同时满足以下两个条件的十进制数.⑴其个位数字与十位数字之和除以10所得的余数是百位数字;⑵该数是素数;求有多少个这样的数? [300,800]范围内同时满足以下两个条件的十进制数.⑴其个位数字与十位数字之和除以10所得的余数是百位数字;⑵该数是素数;求满足上述条件的最大的三位十进制数。

除1和它本身外,不能被其它整数整除的正整数称为素数(注:1不是素数,2是素数)。若两素数之差为2,则称两素数为双胞胎数,问[31,601]之间有多少对双胞胎数。 国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数(素数对)的和。但有些偶数可以分解成多种素数对的和,如:10=3+7,10=5+5,即10可以分解成两种不同的素数对。试求6744可以分解成多少种不同的素数对(注:A+B与B+A认为是相同素数对) 两个素数之差为2,则称这两个素数为双胞胎数。求出[200,1000]之间的最大一对双胞胎数的和。

一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:除1和它本身外,不能被其它整数整除的正整数称为素数,1不是素数,2是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。试求[100,999]之内的所有逆向超级素数的个数。 德国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数(素数对)的和。但有些偶数可以分解成多种素数对的和,如:10=3+7,10=5+5,即10可以分解成两种不同的素数对。试求1234可以分解成多少种不同的素数对(注:A+B与B+A认为是相同素数对)

c语言趣味题

C/C++语言经典、实用、趣味程序设计编程百例精解 1.绘制余弦曲线 在屏幕上用―*‖显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个―*‖。 为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。程序中利用反余弦函数acos计算坐标(x,y) 的对应关系。 使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序说明与注释 #include #include int m ain() { double y; int x,m; for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/ { m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/ for(x=1;x

趣味矩阵C语言课程设计

C语言程序设计

目录 1设计内容与设计要求 (1) 1.1系统的基本功能 (1) 1.2系统的设计要求 (1) 1.3系统维护 (1) 2 系统需求分析 (1) 2.1系统设计目标 (1) 2.2系统设计分析 (2) 3系统的实现 (2) 4 程序调试 (5) 5 总结 (6) 附件:源程序清单 (7)

1系统的功能框架设计 1.1系统的基本功能 首先让我介绍一下矩阵。在数学上,矩阵是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。进行C语言编程中,通过简单的程序设计便可实现矩阵的一系列操作,如矩阵的转置,矩阵对角线上的求和,矩阵左下角、右下角、左上角、右上角的输出,还有回旋矩阵的应用等等,具有很强的观赏性与可观性,并且对于初学者来说,是不可不注重的一种练习方式,而且还有一定的娱乐性。 1.2系统的设计要求 系统通过C语言课程编写须实现以下几个要求: (1)通过Visual C++软件实现对矩阵的一系列操作,如矩阵左下角、右下角、左上角、右上角的数据输出,输出9×9乘法口诀,显示出的矩阵形 式。 (2)实现回旋矩阵的显示形式。 (3)实现对称矩阵数组的显示形式。 1.3系统维护 该功能模块为用户提供维护、设置功能。在相应的设置模块中用户可以自行设置系统的数据,设置完成以后该设置立刻会在系统中生效,并在下一次的使用中反映出来。在这里,数据维护非常重要的,它的作用是将系统中用户选择的数据进行初始化,一旦操作完成,系统中原有的数据将会被全部删除,所以需慎重使用。 2 系统需求分析 2.1系统设计目标 (1)该系统设计主要针对于矩阵的定义、形式,应用C语言编程进行编辑,编译,链接,运行等步骤,实现矩阵各种形式的展现,达到趣味性和娱 乐性的目标。 (2)在应用简单的程序设计,既通过简单的程序运用得到所学知识的简单

C语言程序百例精解

C++语言程序百例精解 C/C++语言经典、实用、趣味程序设计编程百例精解(4) 31.歌德巴赫猜想 验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立)。 *问题分析与算法设计 为了验证歌德巴赫猜想对2000以内的正偶数都是成立的,要将整数分解为两部分,然后判断出分解出的两个整数是否均为素数。若是,则满足题意;否则重新进行分解和判断。 程序中对判断是否为素数的算法进行了改进,对整数判断“用从2开始到该整数的一半”改为“2开始到该整数的平方根”。原因何在请自行分析。 *程序说明与注释 #include<stdio.h> #include<math.h> int fflag(int n); int main() { int i,n; for(i=4;i<=2000;i+=2) { for(n=2;n<i;n++) /*将偶数i分解为两个整数*/ if(fflag(n)) /*分别判断两个整数是否均为素数*/ if(fflag(i-n)) { printf("%14d=%d+%d\n",i,n,i-n); /*若均是素数则输出*/ break; } if(n==i) printf("error %d\n",i); } } int fflag(int i) /*判断是否为素数*/

{ int j; if(i<=1)return 0; if(i==2)return 1; if(!(i%2))return 0; /*if no,return 0*/ for(j=3;j<=(int)(sqrt((double)i)+1);j+=2) if(!(i%j))return 0; return 1; /*if yes,return 1*/ } 32.可逆素数 求四位的可逆素数。可逆素数指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。 *问题分析与算法设计 本题的重点不是判断素数的方法,而是求一个整数的反序数。求反序数的方法是从整数的末尾依次截取最后一位数字,每截取一次后整数缩小10倍,将截取的数字作为新的整数的最后一位(新的整数扩大10倍后加上被截取的数字)。这样原来的整数的数字从低到高被不断地截取,依次作为新的整数从高到低的各位数字。 *程序说明与注释 #include<stdio.h> #include<math.h> int num(int number); int ok(int number); int main() { int i,count; printf("There are invertable primes with 4 digits: \n"); for(count=0,i=1001;i<9999;i+=2) //穷举全部的奇数 { if(num(i)) //若是可逆素数,则输出 printf(count%9 ? "%3d:%d" : "%3d:%d\n",++count,i); } return 0; } int num(int number) { int i,j; if(!ok(number))return 0; //判断是否为素数

c语言趣味编程

VC++上机实验说明 C程序设计同其他程序设计一样,使实践性很强的课程。除了要听好课,多看课外书外,还需大量的上机实践才能更好地理解和掌握所学到的内容。一般来说,上机和讲课时间之比应不少于1:1。但由于目前各校安排的教学时数限制,课内时间将更多的精力用于讲课上,课内安排的上机时间相对较少,学生不要因此对上机的重要性有所误解。学生应在课外再花一定的时间进行C语言的上机实践,这样才能学好该门课。 上机实验的目的有以下几个方面: ⑴验证所编写的程序的正确性。 ⑵进一步理解教材和课堂授课中介绍的内容 ⑶熟练地掌握C程序开发环境的使用,为今后开发大型软件打好基础。 ⑷学习和掌握一般程序的调试和测试方法。 上机前应充分做好以下准备工作: ⑴复习和掌握与本次实验有关的教学内容。 ⑵根据本次实验的内容,在纸上编写好准备上机调试的程序,并初步检查无误。 ⑶准备好对程序进行测试的数据。 ⑷对每种测试数据,给出预期的程序运行结果。 ⑸预习实验步骤,对实验步骤中提出的一些问题进行思考。 上机实验后,应及时写出实验报告,实验报告应包括以下内容: ⑴实验目的和内容。 ⑵程序说明,包括程序结构、各模块的算法(N-S图表示)。 ⑶打印出的调试正确的源程序。 ⑷打印出的程序运行记录(包括对不同测试数据的运行结果)。 ⑸针对实验步骤中提出的问题,写出解决办法及对运行结果的分析。

怎样学习C语言 很多同学对学习C语言感到很难,尤其是在各高校将C语言放在大学第一学年教学时经常会考试不及格。究竟怎样才能学好C语言?这里将我对C语言的理解给大家介绍一下, 计算机语言挺枯燥的,如何提起兴趣? 首先要明确学习的目标,没有明确的学习目标就没有学习动力。给自己定一个目标,比如这次一定通过课程考试,或者这个月学习完做个东西出来等等。其次,确定了目标之后,要认真去做,多上机操作实践,遇到不懂的要多跟教师和其他同学交流,千万不能放弃。当自己编的一段小程序运行通过,或攻下一道难题,自己就会获得一种成就感,可能还会很兴奋,也就渐渐有了兴趣。最后,要把所学的知识运用到实际问题当中,这样既可以巩固所学的知识,不至于完学了就忘,还可以根据实际需要拓展知识面。这样良性循环,兴趣也会越来越浓。 学习计算机语言最好的方法是什么?答曰:读程序。 没错,读程序是学习C语言入门最快,也是最好的方法。不要总是抱着书本逐行啃,而是学习它们的例程。学习完每一章,都要认真体会这一章的所有概念,然后不放过这一章中提到的所有例程,仔细研读程序,直到每一行都理解了,然后找几个编程题目,最好是和例程类似的或一样的,自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了,你就可以写出和它一样的程序,绝对不一定,不相信你就试一试吧,如果写不出来,也不要着急,回过头来再继续研究例程,想想自己为什么写不出来,然后再去写这段程序,反反复复,直到你手到擒来为止。这一过程,就和我们学习任何其他语言比如英语和汉语一样。我们大家都有体会,我们学习一门语言,都是从最基本的语法开始,然后学习一些字和词,再来学习一些词组或句子,然后再用词组和句子组成一段话,表达一个简单的意思,最后才是写一篇文章或者是一本书,表达更复杂的思想。我们知道,在我们完成这一过程时,并不是像说得这么简单。在我们能写出一篇好的文章或者一本好书之前,我们可能需要阅读大量的其他人写的好文章或好书,有时我们还要把它们背下来;同样的,在我们写出一个好的程序或者软件前,我们也需要阅读大量的样本例程或者软件的源代码,甚至要背一些好的程序代码。 写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算法)。? 那么怎样才算精通程序设计呢?怎样才能精通程序设计呢?举个例子:你面前有10个人,找出一个叫“张三”的人,你该怎么办?第一种方法:直接对这10个人问:“谁叫张三”。第2种方法:你挨个去问“你是不是张三?”,直到问到的这个人就是张三。第三种方法:你去挨个问一个人“你认不认识张三,指给我看”。不要小看这个问题,你说当然会选第一种方法,没错恭喜你答对了,因为这个方法最快,效率最高,但是在程序设计中找到解决问题的最优方法和你用的手段却是考验一个程序员程序设计水平的重要标志,而且是不容易达到的。

相关文档