首页 > 试题广场 >

牛牛数数

[编程题]牛牛数数
  • 热度指数:36286 时间限制: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 的倍数,应跳过,剩余数字按升序输出。
#include <stdio.h>
int panduan(int n)
{
    while(n>0)
    {
        if(n%10==4)
        {
            return 1;
        }
        n=n/10;
    }
    return 0;
}
int main() {
    int n,j;
    scanf("%d",&n);
    for(j=1;j<=n;j++)
    {
    if(j!=4&&j%4!=0&&!panduan(j))
    {
        printf("%d\n",j);
    }
    }
    return 0;
}
发表于 2025-12-20 21:59:17 回复(0)
要进行严格的数位判断
#include <stdio.h>
int s(int n) {
    while (n % 10 != 0) {
        if (n % 10 == 4) {
            return 0;
        }
        n /= 10;
    }
    return 1;
}
int l(int n) {
    while (n / 10 != 0) {
        n /= 10;
        if (n == 4) {
            return 0;
        }
    }
    return 1;
}
int r(int n) {
    while (n / 10 != 0 || n % 10 != 0) {
        if (n % 10 == 4) {
            return 0;
        }
        n /= 10;
    }
    return 1;
}
int main() {
    int n;
    scanf("%d", &n);
    if (n <= 1) {
        printf("输入错误");
    } else {
        for (int i = 1; i <= n; i++) {
            if (i % 4 == 0) {
                continue;
            }
            if (!s(i) || !l(i) || !r(i)) {
                continue;
            }
            printf("%d\n", i);
        }
    }
    return 0;
}

发表于 2025-12-14 10:58:57 回复(0)
#include <stdio.h>
int si(int a){
    if(a%4==0){
        return 0;
    }
    int j=a;
    int t=a;
    for(;t>0;t=t/10){
       j=t%10;
       if(j==4){
         return 0;
       }
    }
    return a;
}

int main() {
    int n;
    scanf("%d",&n);
    int i=1;
   for(i=1;i<=n;i++){
    if(si(i)!=0){
    printf("%d\n",i);
     }
   }
   return 0;
}
发表于 2025-11-24 10:58:09 回复(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)
#include <stdio.h>
//一个非常笨的办法
int main() {
    int n,a;
    scanf("%d",&n);
    for(a=1;a<n+1;a++){
        if(a==4||(a%4==0)||(a%10==4)||(a/10%10==4)||(a/100%10==4)||(a/1000%10==4)||(a/10000%10==4))
            continue;
        printf("%d\n",a);
        
    };
    return 0;
}

发表于 2025-11-13 11:07:48 回复(1)
#include <stdio.h>
int contain(int a){
    while(a>0){
        if (a%10==4) {      //如果这里包含4就返回真
            return 1;      
        }
        a = a/10;
    }
    return 0;
}
int main(){
    int n;
    scanf("%d\n",&n);
    for (int i=1;i<=n;i++) {
        if (i%4==0 || contain(i)) {     //如果i能被4整除或者返回为真,即执行跳过
            continue;
        }else {
            printf("%d\n",i);
        }
    }
    return 0;

}
发表于 2025-09-30 21:08:16 回复(0)
#include <stdio.h>

int main() {
    int i,a,b,c=0;
    scanf("%d",&a);
    for(i=0;i<=a;){
        c=i;
        while(c>=10){
             b=c%10;
             c=c/10;
             if(b==4) goto next;
        }
        if(i%4!=0)
            {printf("%d\n",i);}
        next : i++;
    }
}

发表于 2025-09-17 16:05:42 回复(1)
#include <stdio.h>
#include <math.h>
int main() {
    int a;
    char b[64];
    scanf("%d",&a);
    for(int i=0;i<=a;i++){
        int k=0;
        for(int p=0;p<5;p++){
           int h=pow(10,p);
           if((i/h%10)==4){k=1;break;
           }
        }//可以用for搭配取余把分位的数取出来
        if(k==1||i%4==0){
         continue;
        }
        printf("%d\n",i);
    }
    return 0;
}
发表于 2025-08-09 16:02:37 回复(1)
有些难度,对于带有C语言标签的观点,我觉得我的观点应该比较清晰。
#include <stdio.h>
#include <stdbool.h>

int main() {
    int n = 0;

    scanf("%d", &n);

    for (int count = 1; count <= n; count++)
    {
        int temp = 0;
        bool is_contains_four = false;

        /*
        * 是 4 的倍数,直接跳过循环
        */
        if (count % 4 == 0)
        {
            continue;
        }
        else
        {
            /*
            * 不是 4 的倍数就判断 count 的每一位上是否含有数字 4
            */
            temp = count;

            while (temp)
            {
                if (temp % 10 == 4)
                {
                    is_contains_four = true;
                    break;
                }

                temp /= 10;
            }

            if (is_contains_four) continue;
        }

        printf("%d\n", count);
    }

    return 0;
}


发表于 2025-08-08 21:20:17 回复(0)
#include <stdio.h>//参照大佬写的,我之前做的稍微复杂一点

int main() {
    int n,i,j,flag;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        if(i%4)
        {
            j=i;
            flag=1;
            while(j)
            if(j%10!=4)
            {
                j/=10;
            }
            else {
                flag=0;
                break;
            }
            if(flag==1)
            printf("%d\n",i);
        }
    }
    return 0;
}
发表于 2025-07-28 20:13:15 回复(0)
#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)