- 10
- 0
- 约2.8千字
- 约 5页
- 2023-06-14 发布于河南
- 举报
百川东到海,何时复西归?少壮不尽力,老大徒伤悲。——汉乐府《长歌行》
⽤C语⾔解决逢7击掌问题
⽤C语⾔解决“逢7击掌”问题
原题⽬
这是⼀道PTA题⽬,原题是这样的:
⼀群⼈围坐成⼀圈玩报数的游戏。
游戏规则是:从1开始报数,若遇到7的倍数或者个位为7的数则击掌代替,若犯错则要受罚。
可是这些⼈都太聪明了,竟然没⼈犯错!
请问同样聪明的你,现在当报数到 n 时,击掌共次数 c 是多少?
输⼊格式:
n
输出格式:
c
输⼊样例:
21
输出样例:
4
第⼀次尝试
⼀开始,我觉得最先能想到办法是利⽤循环:
当数字是7的倍数或者个位数为7,那么计数器+1
7的倍数,C语⾔的表达式为: i%7 == 0
个位数为7,C语⾔的表达式为: i%10 == 7
这是最为清晰的⼀个思路,⾮常容易理解
相应完整代码为
#include stdio.h
int main()
{
int n, c = 0; //n是待输⼊数据,c是计数器
scanf(%d, n);
for (int i = 1; i = n; i++) {
//如果符合条件,计数器+1
if ( i%7 == 0 || i%10 == 7)
c++;
丈夫志四方,有事先悬弧,焉能钧三江,终年守菰蒲。——《顾炎武》
志不强者智不达,言不信者行不果。——墨翟
c++;
}
printf(%d\n,c);
return 0;
}
(语法标准采⽤C99)
⽤GCC编译器运⾏上⾯的代码:
那么显然,我们认为在GCC上通过了
以家为家,以乡为乡,以国为国,以天下为天下。——《管子·牧民》
以家为家,以乡为乡,以国为国,以天下为天下。——《管子·牧民》
提交系统后?
系统提⽰超时,说明我们得优化思路!
优化超时问题
人不知而不愠,不亦君子乎?——《论语》
以家为家,以乡为乡,以国为国,以天下为天下。——《管子·牧民》
这⾥我们观察规律:
每70个数⾥会有16个数击掌:
1-70
7的倍数:
14、21、28、35、42、49、56、63、70
个位数为7:
17、27、37、47、57、67
个位数为7且为7的倍数:
7
共16个
71-140
7的倍数:
84、91、98、105、112、119、126、133、140
个位数为7:
87、97、107、117、127、137
个位数为7且为7的倍数:
77
共16个
……
所以办法是:
1. 先计算有多少个70个为⼀组的组数(×16,得到前⾯的击掌数)
2. 再计算剩余的不满70个数的那⼀组的击掌数
修改后的代码:
#include stdio.h
int main()
{
int n, c = 0, cnt;
//n是待输⼊数据,c是后⼏个数的计数器,cnt计算有多少个70个为⼀组的组数
scanf(%d, n);
/*
寻找规律:每70个数会有16个数击掌,只要判断剩下的
*/
cnt = n / 70; //计算有多少个70个为⼀组的组数
n %= 70; //将n变为最后剩余不满70个数的⼀组
for (int i = 1; i = n; i++) {
//如果符合条件,后⼏个数的计数器+1
if ( i%7 == 0 || i%10 == 7)
c++;
}
c = c + cnt * 16; //计算总共的击掌数
printf(%d\n,c);
return 0;
您可能关注的文档
最近下载
- IPC-A-600G印制板验收标准(中文版)概论.docx VIP
- 《我们大家跳起来》(课件)人音版音乐四年级下册.ppt VIP
- 22J403-1 楼梯 栏杆 栏板(一) (3).pdf VIP
- (高清版)DB51∕T 3057-2023 四川省政务信息系统建设指南.pdf VIP
- 人工智能人才供需生态分析与教育链协同机制研究.pdf VIP
- 2025至2030中国单细胞基因组测序行业市场占有率及有效策略与实施路径评估报告.docx VIP
- DB43_T 3090-2024水运工程交(竣)工检测规范.pdf VIP
- DB45T 2418-2021 水运工程交工检测与竣工检测规范.pdf VIP
- 2025至2030中国单细胞测序行业市场深度调研及有效策略与实施路径评估报告.docx VIP
- 2025年江苏医药职业学院单招《数学》测试卷附参考答案详解(精练).docx VIP
原创力文档

文档评论(0)