用C语言解决逢7击掌问题.pdfVIP

  • 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;

文档评论(0)

1亿VIP精品文档

相关文档