回来也十天了,中间各种私事,包括替看店等等...不过现在终于有着较大段时间逛逛英雄会了,最近题目出了数道,当然难度也是比较适合的,二星、三星的我还勉强可以一做...废话不多言,说题目吧:
一种报数游戏是从1开始连续报数,如果报到7的倍数(7,14,21,28……)或者包含数字7的数(7,17,27,37……)就用拍手代替这个数而不能报出。假设你连续听到m声拍手,问造成你听到m声拍手的第一下拍手所代表的数是几?
例如,你听到了两次连续的拍手,最小的可能这两次拍手是27和28,因此输出27。
输入m, 输出这m次连续的拍手第一下所代表的最小可能的数。
题目说的还是较清楚的:
1、7的倍数
2、包含数字7的数
另外要求是连续拍手,最后输出是拍手的第一个数,当然这个数要求是最小可能。
0次 1
1次 7
2次 27 28
3次 70...
这样思路就比较清晰了,从1开始报数,找到一个最小的数,它的连续m个数满足以上两个要求之一即可,一直往上寻找即可,时间复杂度是线性的,当寻找到某一个数满足连续m个数,返回初始报数值即可;
#include<stdio.h> int Seven(int num) //包含数字7 { while (num > 0) { if (num % 10 == 7) return 1; num /= 10; } return 0; } int number (int m) { int start = 1; //由1开始 int count = 0; //连续的个数 int n = start; //初始点 while (count < m) //连续的个数 { if (start % 7 == 0 || Seven(start) == 1) { if (count == 0) //重新计数,修改初始n { n = start; } count++; } else count = 0; //非连续 start++; } return n; } //start 提示:自动阅卷起始唯一标识,请勿删除或增加。 int main() { printf("%d",number(1111111)); return 0; } //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
如上程序,起先在测试该测试点的时候我还担心通过时间会超过三秒,心想还得继续优化。不过,幸好,lucky,通过了,还是略水...
在家里做的第一道题啊,难得...话说家里冷啊,学校固然冷但是有暖气,诶,坚持下去!
马上过年了,也是马年哈,祝各位马年愉快!
(*∩_∩*)