没有合适的资源?快使用搜索试试~ 我知道了~
C语言竞赛练习题40题答案.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 22 浏览量
2022-07-11
21:07:44
上传
评论
收藏 144KB DOC 举报
温馨提示
![preview](https://dl-preview.csdnimg.cn/86032562/0001-4be3a4cf864403404186781679f52c7e_thumbnail-wide.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
试读
28页
C语言竞赛练习题40题答案.doc
资源推荐
资源详情
资源评论
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/86032562/bg1.jpg)
第 1 页
C 语言竞赛练习题 1
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 三位小朋友,假设每人每次只能借一本,那么可以有多少种不同的
借法?
![](https://csdnimg.cn/release/download_crawler_static/86032562/bg2.jpg)
第 2 页
*问题分析及算法设计
本问题实际上是一个排列问题,即求从 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 位*/
printb(x,n-1); /*归调用,输出 x 的后 n-1 位*/
![](https://csdnimg.cn/release/download_crawler_static/86032562/bg3.jpg)
第 3 页
*运行结果
输入:8
输出:
number of decimal form:8
it\'s bunary form:01000
输入:-8
输出:number of decimal form:-8
it\'s binary form:1111111111111000
输入:32767
输出:number of decimal form:32767
it\'s binary form:11111
输入:-32768
输出:number of decimal form:-32768
it\'s binary form:10000
输入:128
输出:number of decimal form:128
it\'s binary form:00000
5. 打鱼还是晒网
中国有句俗语叫“三天打鱼两天晒网〞。某人从 1990 年 1 月 1 日起开场“三天打鱼两天晒网〞,问这
个人在以后的某一天中是“打鱼〞还是“晒网〞。
*问题分析及算法设计
根据题意可以将解题过程分为三步:
1)计算从 1990 年 1 月 1 日开场至指定日期共有多少天;
2)由于“打鱼〞和“晒网〞的周期为 5 天,所以将计算出的天数用 5 去除;
3)根据余数判断他是在“打鱼〞还是在“晒网〞;
假设 余数为 1,2,3,那么他是在“打鱼〞
否那么 是在“晒网〞
在这三步中,关键是第一步。求从 1990 年 1 月 1 日至指定日期有多少天,要判断经历年份中是否有闰
年,二月为 29 天,平年为 28 天。闰年的方法可以用伪语句描述如下:
如果 ((年能被 4 除尽 且 不能被 100 除尽)或 能被 400 除尽)
那么 该年是闰年;
否那么 不是闰年。
C 语言中判断能否整除可以使用求余运算(即求模)
*程序及程序注释
#include<stdio.h>
int days(struct date day);
struct date{
int year;
int month;
int day;
void main()
struct date today,term;
int yearday,year,day;
printf("Enter year/month/day:");
scanf("%d%d%d",&today.year,&today.month,&today.day); /*输入日期*/
term.month=12; /*设置变量的初始值:月*/
term.day=31; /*设置变量的初始值:日*/
for(yearday=0,year=1990;year<today.year;year++)
term.year=year;
yearday+=days(term); /*计算从 1990 年至指定年的前一年共有多少天*/
![](https://csdnimg.cn/release/download_crawler_static/86032562/bg4.jpg)
第 4 页
yearday+=days(today); /*加上指定年中到指定日期的天数*/
day=yearday%5; /*求余数*/
if(day>0&&day<4) printf("he was fishing at that day.\\n"); /*打印结果*/
else printf("He was sleeping at that day.\\n");
int days(struct date day)
static int day_tab[2][13]=
{{0,31,28,31,30,31,30,31,31,30,31,30,31,}, /*平均每月的天数*/
{0,31,29,31,30,31,30,31,31,30,31,30,31,},
int i,lp;
lp=day.year%4==0&&day.year%100!=0||day.year%400==0;
/*判定 year 为闰年还是平年,lp=0 为平年,非 0 为闰年*/
for(i=1;i<day.month;i++) /*计算本年中自 1 月 1 日起的天数*/
day.day+=day_tab[lp];
return day.day;
*运行结果
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
6. 抓交通肇事犯
一辆卡车违反交通规那么,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一
些特征。甲说:牌照的前两位数字是一样的;乙说:牌照的后两位数字是一样的,但及前两位不同; 丙是
数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
*问题分析及算法设计
按照题目的要求造出一个前两位数一样、后两位数一样且相互间又不同的整数,然后判断该整数是否
是另一个整数的平方。
*程序及程序注释
#include<stdio.h>
#include<math.h>
void main()
int i,j,k,c;
for(i=1;i<=9;i++) /*i:车号前二位的取值*/
for(j=0;j<=9;j++) /*j:车号后二位的取值*/
if(i!=j) /*判断二位数字是否相异*/
k=i*1000+i*100+j*10+j; /*计算出可能的整数*/
for(c=31;c*c<k;c++); /*判断该数是否为另一整数的平方*/
if(c*c==k) printf("Lorry--No. is %d.\\n",k); /*假设是,打印结果*/
*运行结果
Lorry _No.is 7744
7. 该存多少钱
假设银行一年整存零取的月息为 0.63%。现在某人手中有一笔钱,他打算在今后的五年中的年底取出 1000
元,到第五年时刚好取完,请算出他存钱时应存入多少。
*问题分析及算法设计
分析存钱和取钱的过程,可以采用倒推的方法。假设第五年年底连本带息要取 1000 元,那么要先求出
第五年年初银行存款的钱数:
第五年初存款=1000/(1+12*0.0063)
依次类推可以求出第四年、第三年......的年初银行存款的钱数:
![](https://csdnimg.cn/release/download_crawler_static/86032562/bg5.jpg)
第 5 页
第四年年初存款=(第五年年初存款+1000)/(1+12*0.0063)
第三年年初存款=(第四年年初存款+1000)/(1+12*0.0063)
第二年年初存款=(第三年年初存款+1000)/(1+12*0.0063)
第一年年初存款=(第二年年初存款+1000)/(1+12*0.0063)
通过以上过程就可以很容易地求出第一年年初要存入多少钱。
*程序及程序注释
#include<stdio.h>
void main()
int i;
float total=0;
for(i=0;i<5;i++) /*i 为年数,取值为 0~4 年*/
total=(total+1000)/(1+0.0063*12); /*累计算出年初存款数额,第五次的计算
结果即为题解*/
printf("He must save %.2f at first.\\n",total);
*运行结果
He must save 4039.44 at first
8. 怎样存钱利最大
假设银行整存整取存款不同期限的月息利率分别为:
0.63% 期限=1 年
0.66% 期限=2 年
0.69% 期限=3 年
0.75% 期限=5 年
0.84% 期限=8 年
利息=本金*月息利率*12*存款年限。
现在某人手中有 2000 元钱,请通过计算选择一种存钱方案,使得钱存入银行 20 年后得到的利息最多(假
定银行对超过存款期限的那一局部时间不付利息)。
*问题分析及算法
为了得到最多的利息,存入银行的钱应在到期时马上取出来,然后立刻将原来的本金和利息加起来再
作为新的本金存入银行,这样不断地滚动直到满 20 年为止,由于存款的利率不同,所以不同的存款方法(年
限)存 20 年得到的利息是不一样的。
分析题意,设 2000 元存 20 年,其中 1 年存 i1 次,2 年存 i2 次,3 年存 i3 次,5 年存 i5 次,8 年存 i8
次,那么到期时存款人应得到的本利合计为:
2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8
其中 rateN 为对应存款年限的利率。根据题意还可得到以下限制条件:
0<=i8<=2
0<=i5<=(20-8*i8)/5
0<=i3<=(20-8*i8-5*i5)/3
0<=i2<=(20-8*i8-5*i5-3*i3)/2
0<=i1=20-8*i8-5*i5-3*i3-2*i2
可以用穷举法穷举所有的 i8、i5、i3、i2 和 i1 的组合,代入求本利的公式计算出最大值,就是最正
确存款方案。
*程序及程序注释
#include<stdio.h>
#include<math.h>
void main()
int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
float max=0,term;
for(i8=0;i8<3;i8++) /*穷举所有可能的存款方式*/
for(i5=0;i5<=(20-8*i8)/5;i5++)
for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)
剩余27页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
kfcel5889
- 粉丝: 3
- 资源: 5万+
![benefits](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-1.c8e153b4.png)
下载权益
![privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-2.ec46750a.png)
C知道特权
![article](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-3.fc5e5fb6.png)
VIP文章
![course-privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-4.320a6894.png)
课程特权
![rights](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-icon.fe0226a8.png)
开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)