回来也十天了,中间各种私事,包括替看店等等...不过现在终于有着较大段时间逛逛英雄会了,最近题目出了数道,当然难度也是比较适合的,二星、三星的我还勉强可以一做...废话不多言,说题目吧:
一种报数游戏是从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,通过了,还是略水...
在家里做的第一道题啊,难得...话说家里冷啊,学校固然冷但是有暖气,诶,坚持下去!
马上过年了,也是马年哈,祝各位马年愉快!
(*∩_∩*)