洛谷 P1008 三连击 将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。 输入输出格式 输入格式: 木有输入 输出格式: 若干行,每行33个数字。按照每行第11个数字升序排列。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[10], b[10], c[10], n1[999], n2[999], n3[999], s[10], i, j, k, f, t, r;   //创建三个数组,用来存放1-9
    t = 1;
    for (i=1; i<=10; i++)      //为三个数组赋值1-9
    {
        a[i] = i;
        b[i] = i;
        c[i] = i;
    }

//### 列出符合“在1-9选三个数组成各位都不同”的第一个三位数 ###

    for (i=1; i<4; i++)    //第一层循环控制第一位数(百位),并且剔除掉超过400的数
    {
        for (j=1; j<10; j++)    //二层循环控制第二位(十位)
        {
            if (j!=i)   //保证第二位中不含第一位的数字(剔除十位中的百位数字)
            {
                for (k=1; k<10; k++)    //三层循环控制第一位(个位)
                {
                    if (k!=i && k!=j)   //保证不含第一、二位中的数(剔除个位中百、十位中数字)
                    {
                        n1[t] = a[i]*100 + b[j]*10 +c[k];  //将三位不同数字组合成第一个三位数
                        n2[t] = n1[t] * 2;      //第二个三位数
                        n3[t] = n1[t] * 3;      //第三个三位数
                        t++;        //确定符合条件的第一个三位数的个数,用于下面控制循环
                    }
                }
            }
        }
    }

    //### 循环判断三个三位数所含数字在1-9中且各不相同 ##
    for (f=1; f<t; f++)     //一层循环,循环遍历上面求出的在数组n*[]中的元素
    {
        if (n1[f]>191 && n1[f]<334)     //确定所求第一位三位数在191-334之间,其余不符合条件
        {                               //把三个三位数中全部9个数存放在数组s[]中
            s[0] = n1[f] / 100;
            s[1] = (n1[f] % 100) / 10;
            s[2] = n1[f] % 10;
            s[3] = n2[f] / 100;
            s[4] = (n2[f] % 100) / 10;
            s[5] = n2[f] % 10;
            s[6] = n3[f] / 100;
            s[7] = (n3[f] % 100) / 10;
            s[8] = n3[f] % 10;
            r = 0;      //r赋值0(清零)
            for (i=0; i<8; i++)     //确保三个三位数中不含相同数字且不含数字0
            {
                for (j=i+1; j<9; j++)
                {
                    if (s[i]==s[j] || s[i]==0 || s[j]==0)   //如果有相同数字或有数字0则令r=1并跳转
                        {
                            r = 1;
                            goto A;
                        }
                }
            }

            A:
            if (r == 0)     //如果各位数字均不同并且不含有数字0,则输出
            {
                printf("%d %d %d\n", n1[f], n2[f], n3[f]);
            }
        }
    }
}

posted @ 2018-09-11 15:43  崔杯杯  阅读(3298)  评论(0编辑  收藏  举报