注册 登录
编程论坛 C语言论坛

刚学C语言,不太会,用多重循环,求大佬赐教

opq2020 发布于 2020-04-03 18:43, 3553 次点击
输出 1000 到 20000 之间的数据中有 3 个数字为 9 的所有整数,每行输出 8 个数
10 回复
#2
hbccc2020-04-03 19:32
用%和/来求
#3
lin51616782020-04-03 19:54
9999算不算?
有没有要求按照从小到大的顺序输出
乱序可以吗

[此贴子已经被作者于2020-4-3 19:57编辑过]

#4
吕孟伟2020-04-03 22:09
程序代码:
#include<stdio.h>

int main(void) {
   
    int i, n, cnt, index;

    for(i = 1000, index = 0; i <= 20000; ++i) {
        n = i;
        cnt = 0;
        while( n ) {
            if(n % 10 == 9) {
                ++cnt;
            }
            n /= 10;
        }
        if(3 == cnt) {
            printf("%d\t", i);
            ++index;
            if(index%8 == 0) {
                printf("\n");
            }
        }

    }

    return 0;
}

输出:
1999    2999    3999    4999    5999    6999    7999    8999
9099    9199    9299    9399    9499    9599    9699    9799
9899    9909    9919    9929    9939    9949    9959    9969
9979    9989    9990    9991    9992    9993    9994    9995
9996    9997    9998    10999   11999   12999   13999   14999
15999   16999   17999   18999   19099   19199   19299   19399
19499   19599   19699   19799   19899   19909   19919   19929
19939   19949   19959   19969   19979   19989   19990   19991
19992   19993   19994   19995   19996   19997   19998
代码较丑,你可以再简化写得优美一些。再根据楼上的问题适当地进行修改。
#5
wmf20142020-04-03 22:14
笨方法是从1000循环到20000,按位统计3个9的数输出,循环19000次。还有一个高效办法是先把999定位,用9进制计数器把9逐位挤出来,大概循环4×9+4×9-1=71次即可得到结果。
#6
hbccc2020-04-03 22:24

//输出 1000 到 20000 之间的数据中有 3 个数字为 9 的所有整数,每行输出 8 个数
//writer:hbccc
#include<stdio.h>
#include<stdbool.h>

int main(void)
{
    int a=0,sum=0,hh=0;
    bool nine[5]={false,false,false,false,false};
   
    for(int i=1000;i<=20000;i++)
    {
        a=i;
        for(int j=0;j<5;j++)
        {
        if(a%10==9)
        {
            nine[j]=true;
            sum+=nine[j];
        }
        a/=10;
        }
        if(sum>=3&&sum<=5)
        {
            printf("%d\t\t",i);
            hh++;
            if(hh==8)
            {
                printf("\n");
                hh=0;
            }
        }
        sum=0;
        
        
        for(int j=0;j<5;j++)
        {
            nine[j]=false;
        }
    }
    return 0;
}
#7
rjsp2020-04-03 23:17
3楼的问题很重要,“9999算不算?
假设是 允许3个9的话,
程序代码:
#include <stdio.h>

int main( void )
{
    for( unsigned i=1; i!=72; ++i )
    {
        unsigned x = (unsigned[]){1000,100,10,1}[i%36/9];
        printf( "%u%c", i/36*10000 + 999%x + 999/x*x*10 + i%9*x, " \n"[i%8==0] );
    }
}


#8
纯蓝之刃2020-04-03 23:59
回复 7楼 rjsp
这种写法是哪里规定的呢?
一开始根本就看不明白,后来根据输出结果大概理解这么写的含义了,
但是还是不知道这么写的格式依据是什么。换句话说,me孤陋寡闻了。。。(没见过)
#9
lin51616782020-04-04 01:53
回复 8楼 纯蓝之刃
C99的复合字面量
https://zh.
#10
wmf20142020-04-04 07:21
回复 7楼 rjsp

将rjsp版主代码修改为大部分编译器可编译的代码:
程序代码:
#include <stdio.h>

int main(void)
{
    int i, x, a[] = { 1000,100,10,1 };
    for (i = 1; i != 72; ++i)
    {
        x = a[i % 36 / 9];
        printf("%5d%c", i / 36 * 10000 + 999 % x + 999 / x * x * 10 + i % 9 * x, i % 8 ? ' ':'\n');
        //" \n"[i%8==0]等同于字符串常量指针运算,二选一的话用三目运算更容易理解些
    }
}


“999 / x * x * 10”可不要迷惑哦,不能像数学里那样:干嘛不直接写“9990”,其实是动态地输出0,9000,9900,9990

[此贴子已经被作者于2020-4-4 07:32编辑过]

#11
opq20202020-04-30 17:51
加油
1