题目描述
输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)
输入
首先输入一个整数t,表示有t组数据。
然后有t行,每行一个整数N。(N不大于30000)
输出
对于每组数据 ,输出从小到大排列的不大于N的与7有关的数字。每组数据占一行,每个数字后面有一个空格;
样例输入
2
20
30
样例输出
7 14 17
7 14 17 21 27 28
思路:
这个题目要求的就是逢7的倍数或着含7这个数字的就过,那我们就可以通过循环,从1循环到N,判断一下循环的数字中有多少个满足要求的数字并输出。我么接下来进行分析如何判断是否满足这两个要求。对于第一个要求,是7的倍数,我们可以直接用这个数对7取余,如果余数是0,那么这个数就是7的倍数。对于第二个要求,数字中含有7,我们可以依次取余进行判断,也就是判断最后一位是不是7,如果不是,就缩小10倍,继续进行判断,直到这个数小于0或者余数里有7结束这次判断。可以结合代码看一下,会更好理解。
代码:
#include<stdio.h>
int main() {
int t;
scanf("%d", &t); // 输入有几组数据
for (int i = 0; i < t; i++) // 有几组数据循环几次
{
int N;
scanf("%d", &N);
for (int j = 1; j <= N; j++) // 从1循环到N
{
if (j % 7 == 0) // 7的倍数
{
printf("%d ", j);
}
else // 不是7的倍数
{
int b = j;
while (b > 0)
{
int a = b % 10; //判断最后一位数字是否是7
if (a == 7) // 最后一位数字是7,也就是这个数虽然不是7的倍数,但是其中某一位含有7
{
printf("%d ", j); // 输出这个数
break; // 跳出这个循环
}
b /= 10; // 如果当前这个数的末位不是7,则除以10,继续判断最后一位是不是7,直到这个数小于0
}
}
}
printf("\n");
}
return 0;
}