首页 > 试题广场 >

牛牛数数

[编程题]牛牛数数
  • 热度指数:42412 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}牛牛在酒桌上玩一个小游戏,第一个人从 1 开始数数,如果遇到数字中含有数字 4 或数字是 4 的倍数,则跳过这个数字报下一个,谁数错了就要罚酒一杯。

\hspace{15pt}牛牛为了作弊,它想将所有符合规则的数字预先生成出来。请你帮助牛牛列出 1n 之间所有既不包含数字 4 又不是 4 的倍数的整数,按升序输出。

输入描述:
\hspace{15pt}在一行中输入一个正整数 n,满足 1 \leqq n \leqq 10^5


输出描述:
\hspace{15pt}按升序输出所有满足条件的整数,每个数字占一行。
示例1

输入

9

输出

1
2
3
5
6
7
9

说明

19 中,数字 4 含有数字 4 且 4,84 的倍数,应跳过,剩余数字按升序输出。
n=int(input())
for i in range(n+1):
    if i%4 != 0 and ('4' not in str(i)):
        print(i)
发表于 2025-06-23 10:20:59 回复(1)
#include <stdio.h>

int main()
{
    int n,i,j,flag;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        if(i%4)//判断是否是4的倍数
        {
            flag=1;//标记可能为正确结果
            j=i;
            while(j)//判断那些不是4的倍数的数中是否含有4
            {
                if(j%10==4)
                {flag=0;break;}
                j/=10;
            }
            if(flag)
            printf("%d\n",i);
        }
    }
    return 0;
}
发表于 2025-07-09 16:28:03 回复(0)
#include <stdio.h>
int main()
{
    int  n=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)//下面的分类是针对到具体的那个数字。不要理解错误
    {
        if(i%4>0)//非4的倍数
        {
            if(i<=10)
            {
                printf("%d\n",i);
            }
            else if(i>10)
            {
                for(int i1=i;i1>0;i1=i1/10)//是为了判断i中的每一位是否有4
                {
                    if(i1%10==4)
                    {
                        break;
                    }
                    else if(i1%10!=4)//一旦有4就去掉,当i1为个位数时,再余10也是个位
                    {
                        if(i1<10)
                        {
                            printf("%d\n",i);
                        }
                    }
                }
            }
        }
    }
    return 0;
}
卡在那个去除所有含有4的数字这一步很久(楼主菜)。
for(int i1=i;i1>0;i1=i1/10)//是为了判断i中的每一位是否有4
                {
                    if(i1%10==4)
                    {
                        break;
                    }
                    else if(i1%10!=4)//一旦有4就去掉,当i1为个位数时,再余10也是个位
                    {
                        if(i1<10)
                        {
                            printf("%d\n",i);
                        }
                    }
                }
找到有4的数不难,主要是那个输出部分老是出错,printf函数没放好,导致出现了好几次一样的数(比如111,就会输出3次,循环出了问题)。
总之希望我的解题方法能够对大家有所帮助吧,更希望大家能多多提出批评,聊一聊大家的见解,共同进步。



发表于 2025-11-23 15:54:43 回复(2)
n = int(input())
#不包含4的判断方法
def has_no_digit4(num):
    return '4' not in str(num)

#不被4整除的判断方法
def can_not_4(num):
    return num % 4 != 0

for i in range(1,n+1):
    if can_not_4(i) and has_no_digit4(i):
            print(i)

发表于 2025-06-30 16:25:51 回复(0)
n = int(input())
for i in range(1,n+1):
    if i % 4 ==0 or '4' in str(i):
        continue
    else:
        print(i)
发表于 2025-05-27 11:42:50 回复(0)
#include <stdio.h>
int fun(int n){
    int m;
    while (n) {
        m=n%10;
        if(m==4){
            return 0;
        }
    n/=10;
    }
    return 1;
}
int main(){
    int n;
    scanf("%d",&n);
for(int i=1;i<=n;i++){
    if(i%4!=0&&fun(i)){
        printf("%d\n",i);
    }
}
return 0;
}

发表于 2026-01-12 21:44:34 回复(0)
int main() {
    int a;
    cin >> a;
    for(int i = 1; i <= a; i ++) if(i % 4 != 0 && to_string(i).find('4') == string::npos) cout << i << endl;
}
发表于 2025-12-06 14:39:23 回复(1)
n=int(input())
p=1<=n<=10**5
if p:
    for i in range(1,n+1):
        p1=i%4!=0
        p2='4' not in str(i)
        if p1*p2:print(i)
else:print('超出范围')

发表于 2025-10-30 11:38:02 回复(0)
def contains4(x) -> bool:
    while x > 0:
        if x % 10 == 4:
            return True
        x //= 10
    return False

n : int = int(input())
counter = 1
while counter <= n:
    if not contains4(counter) and counter % 4 != 0:
        print(counter)
    counter += 1

发表于 2025-07-24 11:53:05 回复(0)
#include <iostream>
using namespace std;
int f(int b);
int f(int b){
    int i;
    while(b){
        i=b%10;
        b/=10;
        if(i==4){
            return 1;
        }
    }
    return 0;
}
int main() {
    int a, b;
cin>>a;
for(b=1;b<=a;b++){
    if(b==4||b%4==0){
        continue;
    }
    if(f(b)){
        continue;
    }
    cout<<b<<endl;
}
}

发表于 2026-01-23 10:48:46 回复(0)
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
if (i % 4 == 0) continue; // 排除4的倍数
// 检查是否包含数字4
int temp = i;
int hasFour = 0;
while (temp > 0) {
if (temp % 10 == 4) {
hasFour = 1;
break;
}
temp /= 10;
}
if (!hasFour) {
printf("%d\n",i);
}
}}
发表于 2026-01-22 12:45:55 回复(0)
#include <stdio.h>

int main() {
   int n;
   scanf("%d",&n);
   for(int i;i<=n;i++)
   {
    if(i%4!=0)
    printf("%d\n",i);
   }
    return 0;
}
这么些对吗?怎么通过不了
发表于 2026-01-20 22:45:41 回复(1)
n = int(input())

list_nums = []
for i in range(1, n+1):
    if i % 4 == 0:
        pass
    elif '4' in list(str(i)): #判断i包不包含4,注意此时是列表,就要是字符串4
        pass
    else:
        list_nums.append(i)

for i in list_nums:
    print(i)
发表于 2026-01-14 12:43:53 回复(0)
我自罚一杯
发表于 2026-01-12 08:51:55 回复(0)
#include <stdio.h>
int main()
{
   int i,j,n,a[100000];
   scanf("%d",&n);
   for(i=0;i<n;i++)
   a[i]=i+1;
for(i=0;i<n;i++)
for(j=a[i];j>0;j=j/10)
{
    if(j%10==4)
    a[i]=0;
    break;
}
for(i=0;i<n;i++)
if(a[i]!=0&&a[i]%4!=0)
printf("%d\n",a[i]);
    return 0;
}
为什么我的代码不能通过所有测试?求解
发表于 2026-01-09 19:12:39 回复(0)
n = int(input())
i = 0
while i < n:
    i += 1
    if i % 4 == 0 :
        continue
    if '4' in str(i):
        continue
    print(i)

发表于 2026-01-09 16:37:07 回复(0)
#include <stdio.h>
#include<string.h>
int main() {
    int a;
    char c[6];
    scanf("%d", &a);
    for(int i = 1;i <= a;i++){
        if(i % 4 == 0) continue;
        sprintf(c, "%d", i);
        if(strchr(c, '4') != NULL == 0) printf("%d\n", i);
    }
    return 0;
}
发表于 2026-01-09 13:04:34 回复(1)
#include <stdio.h>

int main() {
	int n;
	if (scanf("%d", &n) != 1) {
		return 1;
	}
	if (n < 1 || n > 1e5) {
		return 1;
	}
	for (int i = 1; i <= n; i += 1) {
		if (i % 4 != 0 && i % 10 != 4 && i / 10 % 10 != 4 && i / 100 % 10 != 4 && i / 1000 % 10 != 4 && i / 10000 != 4) {
			printf("%d\n", i);
		}
	}
	return 0;
}

发表于 2026-01-06 18:50:33 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int i = 1;
    for (i = 1; i<=n; i++){
        if(i%4!=0){
            int temp = i,flag = 0;
            while(temp>0){
                if(temp%10==4){
                    flag = 1;
                    break;
                }
                temp/=10;
            }
            if (!flag){
                printf("%d\n", i);
            }
        }
    }
}


发表于 2025-12-27 22:47:39 回复(0)
n = int(input())

if  1<=n<=10**5:
    list_no4 = []
    for i in range(1,n+1):
        if i%4!=0 and '4' not in str(i):
            list_no4.append(i)
    list_no4.sort()
    print(*list_no4, sep='\n')


发表于 2025-12-22 11:04:55 回复(0)