C语言竞赛练习题
目录
一、穷举
1、求最大数
2、高次方数的尾数
3、借书方案知多少
6、抓交通肇事犯
12、平分七筐鱼
13、有限5位数
14、除不尽的数
15、一个奇异的三位数
16、位反序数
17、求车速
18、阿姆斯特朗数
19、完全数
20、亲密数
21、自守数
22、回文数
23、求具有abcd=(ab+cd)2性质的四位数
24、求素数
25、歌德巴赫猜想
26、要发就发
27、素数幻方
28、百钱百鸡问题
29、斯坦的数学题
31、换分币
32、三球问题
33、马克思手稿中的数学题
34、分数比较、分数之和
35、将真分数分解为埃及分数
36、列出真分数序列
37、计算分数的精确值
38、谁是窃贼
39、黑与白
40、迷语博士的难题
41、哪个大夫哪天值班
42、区分旅客国籍
43、谁家孩子跑最慢
44、拉丁方
45、填表格
46、1~9分成1:2:3的三个3位数
47、1~9组成三个3位的平方数
48、由8个整数形成奇特的立方体
49、减式还原
50、乘式还原
51、九位累进可除数
52、魔术师的猜牌术
53、约瑟夫问题、邮票组合
54、和数能表示1~23的5个正整数
55、可称1~40磅的4块砝码
56、10个小孩分糖果
57、小明买书
61、四方定理
63、尼科彻斯定理
65、自动发牌
66、黑白子交换
67、常胜将军
二、计算
4、数制转换
5、打鱼还是晒网
7、该存多少钱
8、怎样存钱利最大
9、捕鱼和分鱼
10、出售金鱼
11、分数四则运算
30、年龄几何
58、波松瓦酒的分酒趣题
59、波松瓦酒的分酒趣题
60、角谷猜想
62、卡布列克常数
64、回文数的形成
1. 求最大数
问555555的约数中最大的三位数是多少?
*问题分析与算法设计
根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。因此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。本题只要求取约数中最大的三位数,则其取值范围可限制在100到999之间。
*程序说明与注释
#include<stdio.h>
void main()
{
long i;
int j;
数学二进制的算法 printf("Please input number:");
scanf("%ld",&i);
for(j=999;j>=100;j--)
if(i%j==0)
{
printf("The max factor with 3 digits in %ld is:%d,\\n",i,j);
break;
}
}
*运行结果
输入:555555
输出:The max factor with 3 digits in 555555 is:777
2. 高次方数的尾数
求13的13次方的最后三位数
*问题分析与算法设计
解本题最直接的方法是:将13累乘13次方截取最后三位即可。
但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。
研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。
*程序说明与注释
#include<stdio.h>
void main()
{
int i,x,y,last=1; /*变量last保存求X的Y次方过程中的部分乘积的后三位*/
printf("Input X and Y(X**Y):");
scanf("%d**%d",&x,&y);
for(i=1;i<=y;i++) /*X自乘Y次*/
last=last*x%1000; /*将last乘X后对1000取模,即求积的后三位*/
printf("The last 3 digits of %d**%d is:%d\\n",x,y,last%1000); /*打印结果*/
}
*运行结果
Input X and Y(X**Y):13**13
The last 3 digits of 13**13 is:253
Input X and Y(X**Y):13**20
The last 3 digits of 13**20 is:801
3. 借书方案知多少
小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
*问题分析与算法设计
本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
*程序说明与注释
void main()
{
int a,b,c,count=0;
printf("There are diffrent methods for XM to distribute books to 3 readers:\\n");
for(a=1;a<=5;a++) /*穷举第一个人借5本书中的1本的全部情况*/
for(b=1;b<=5;b++) /*穷举第二个人借5本书中的一本的全部情况*/
for(c=1;a!=b&&c<=5;c++) /*当前两个人借不同的书时,穷举第三个人借5本书
中的1本的全部情况*/
if(c!=a&&c!=b) /*判断第三人与前两个人借的书是否不同*/
printf(count%8?"%2d:%d,%d,%d ":"%2d:%d,%d,%d\\n ",++count,a,b,c);
/*打印可能的借阅方法*/
}
*运行结果
There are diffrent methods for XM to distribute books to 3 readers:
1: 1,2,3 2: 1,2,4 3: 1,2,5 4: 1,3,2 5: 1,3,4
6: 1,3,5 7: 1,4,2 8: 1,4,3 9: 1,4,5 10:1,5,2
11:1,5,3 12:1,5,4 13:2,1,3 14:2,1,4 15:2,1,5
16:2,3,1 17:2,3,4 18:2,3,5 19:2,4,1 20:2,4,3
21:2,4,5 22:2,5,1 23:2,5,3 24:2,5,4 25:3,1,2
26:3,1,4 27:3,1,5 28:3,2,1 29:3,2,4 30:3,2,5
31:3,4,1 32:3,4,2 33:3,4,5 34:3,5,1 35:3,5,2
36:3,5,4 37:4,1,2 38:4,1,3 39:4,1,5 40:4,2,1
41:4,2,3 42:4,2,5 43:4,3,1 44:4,3,2 45:4,3,5
46:4,5,1 47:4,5,2 48:4,5,3 49:5,1,2 50:5,1,3
51:5,1,4 52:5,2,1 53:5,2,3 54:5,2,4 55:5,3,1
56:5,3,2 57:5,3,4 58:5,4,1 59:5,4,2 60:5,4,3
4. 数制转换
将任一整数转换为二进制形式
*问题分析与算法设计
将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说,一个整数在计算机内就是以二进制的形式存储的,所以没有必要再将一个整数经过一系列的运算转换为二进制形式,只要将整数在内存中的二进制表示输出即可。
*程序说明与注释
#include<stdio.h>
void printb(int,int);
void main()
{
int x;printf("Input number:");
scanf("%d",&x);
printf("number of decimal form:%d\\n",x);
printf(" it\'s binary form:");
printb(x,sizeof(int)*8); /*x:整数 sizeof(int):int型在内存中所占的字节数
sizeof(int)*8:int型对应的位数*/
putchar(\'\\n\');
}
void printb(int x,int n)
{
if(n>0)
{
putchar(\'0\'+((unsigned)(x&(1<<(n-1)))>>(n-1))); /*输出第n位*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论