欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷 P1008 三连击 将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。 ...

程序员文章站 2022-03-10 09:47:01
...
#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]);
            }
        }
    }
}