洛谷P1008 三连击题解合集

题目传送门

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2,⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

代码

暴力九重循环:

#include <stdio.h>
#include <cstdlib>
int main()
{
    int i[9];
    for (i[0] = 1; i[0] <= 9; i[0]++)
    {
        for (i[1] = 1; i[1] <= 9; i[1]++)
        {
            int p1=0;
            if (i[1] == i[0]) p1 = 1;
            if (p1 != 1) {
                for (i[2] = 1; i[2] <= 9; i[2]++)
                {
                    int p2=0;
                    for (int j2 = 0; j2 < 2; j2++) if (i[2] == i[j2]) p2 = 2;
                    if (p2 != 2) {
                        for (i[3] = 1; i[3] <= 9; i[3]++)
                        {
                            int p3=0;
                            for (int j3 = 0; j3 < 3; j3++) if (i[3] == i[j3]) p3 = 3;
                            if (p3 != 3) {
                                for (i[4] = 1; i[4] <= 9; i[4]++)
                                {
                                    int p4=0;
                                    for (int j4 = 0; j4 < 4; j4++) if (i[4] == i[j4]) p4 = 4;
                                    if (p4 != 4) {
                                        for (i[5] = 1; i[5] <= 9; i[5]++)
                                        {
                                            int p5=0;
                                            for (int j5 = 0; j5 < 5; j5++) if (i[5] == i[j5]) p5 = 5;
                                            if (p5 != 5) {
                                                for (i[6] = 1; i[6] <= 9; i[6]++)
                                                {
                                                    int p6=0;
                                                    for (int j6 = 0; j6 < 6; j6++) if (i[6] == i[j6]) p6 = 6;
                                                    if (p6 != 6) {
                                                        for (i[7] = 1; i[7] <= 9; i[7]++)
                                                        {
                                                            int p7=0;
                                                            for (int j7 = 0; j7 < 7; j7++) if (i[7] == i[j7]) p7 = 7;
                                                            if (p7 != 7) {
                                                                for (i[8] = 1; i[8] <= 9; i[8]++)
                                                                {
                                                                    int p8=0;
                                                                    for (int j8 = 0; j8 < 8; j8++) if (i[8] == i[j8]) p8 = 8;
                                                                    if (p8 != 8) {
                                                                        //printf("%d %d %d %d %d %d %d %d %d\n", i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8]);
                                                                        int a = 100 * i[0] + 10 * i[1] + i[2];
                                                                        int b = 100 * i[3] + 10 * i[4] + i[5];
                                                                        int c = 100 * i[6] + 10 * i[7] + i[8];
                                                                        double d1 = double(a) / b;
                                                                        double d2 = double(c) / b;
                                                                        if (d1 == 0.5 && d2 == 1.5)
                                                                        {
                                                                            printf("%d %d %d\n", a, b, c);
                                                                            //system("pause");
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    system("pause");
    return 0;
}

最短写法:

#include<cstdio>
#include<cstring>
int i,j,v;bool a[10];//ai表示第i个数已经用过了
int main()
{
    for(i=192;i<=327;i++)//第一个数最小192,最大327。其实不知道的情况下简单来说是从123-329的但是算出来是最值就稍微改了下下
    {
        memset(a,0,sizeof(a));
        v=0;//清零
        a[i%10]=a[i/10%10]=a[i/100]=a[i*2%10]=a[i*2/10%10]=a[i*2/100]=a[i*3%10]=a[i*3/10%10]=a[i*3/100]=1;//统计数字
        for(j=1;j<=9;j++) v+=a[j];//v表示1-9这些数字是否全部齐了
        if(v==9) printf("%d %d %d\n",i,i*2,i*3);//如果齐了就输出
    }
return 0;
}

较好理解函数型:

#include<iostream>
using namespace std;
int gw; //个位 
int d[9];//用来计数,因为一个数的个位只可能是1,2,3...到9,所以只要9位
int cf(int x){//我们定义一个函数,拆分我们组合出来的每一位数,所以它叫拆分√ 
    while(x!=0){        
        gw=x%10;
        x=(x-gw)/10; //其实完全可以x/10,为了理解方便,我们将x的个位减为0,然后/10把0削去,不断将当期的数拆分
        d[gw]++;//计数器加1
    }
}
int main(){
    int a,b,c;
    for (int i=1;i<=9;i++)
        for (int j=1;j<=9;j++)
            for (int k=1;k<=9;k++){
                a=i*100+j*10+k;
                b=a*2;
                c=a*3;
                cf(a);//将创造出的满足条件的数扔到函数中拆分
                cf(b);
                cf(c);
                if(d[1]==1&&d[2]==1&&d[3]==1&&d[4]==1&&d[5]==1&&d[6]==1&&d[7]==1&&d[8]==1&&d[9]==1){//如果这3个创造出来的数满足每一位都被使用且只用1次,输出
                    cout<<a<<" "<<b<<" "<<c<<endl;
                }
                for (int e=1;e<=9;e++){//判断之后将计数的数组置为0,方便下次使用,不然你一个数都不会输出
                    d[e]=0;//其实可以用memset重置,但是懒得修改了。不了解memset的可以百度一下
                }
            }
            return 0;//华华丽丽的结束
}

三重循环型:

#include<iostream>
using namespace std;
int main()
{ int i,j,k,q,w,e,r,t,y,u,p,o,a[9],m,n,v=0;
for(i=1;i<=3;i++)//百位不可能大于4,否则乘三大于999
 for(j=1;j<=9;j++)//0不符合从1开始
  for(k=1;k<=9;k++)//同上
  {q=i*100+j*10+k;//第一个数
  w=q*2;//第二个
  e=q*3;//第三个
  r=w/100;//第二个数百位
  t=(w%100)/10;//十位
  y=w%10;//个位
  u=e/100;//第三个数百位
  p=(e%100)/10;//十位
  o=e%10;//个位
  a[0]=i;//储存第一二三个数的百十个位数
  a[1]=j;
  a[2]=k;
  a[3]=r;
  a[4]=t;
  a[5]=y;
  a[6]=u;
  a[7]=o;
  a[8]=p;
  v=0;
  for(m=0;m<=8;m++)//一个数一个数比较,若有相同v=1
   for(n=m+1;n<=8;n++)
   {if(a[m]==a[n])
   v=1;
   }
  if(v!=1&&e<=999&&t!=0&&y!=0&&o!=0&&p!=0)//如果没有相同的就输出
  cout<<q<<" "<<w<<" "<<e<<endl;
  }
return 0;
}

暴力枚举型:

#include<stdio.h>
#include<string.h>
int a[10];
int main(){
    for (int x=123;x<=329;x++){     //枚举
        int i=x,j=x*2,k=x*3;
        int o=i,p=j,q=k;
        int flag=0;                         //清零
        memset(a,0,sizeof(a));
        while(i>0){                        //取数
            a[i%10]++;
            i/=10;
        }
        if(flag==1) continue;
        while(j>0){
            a[j%10]++;
            j/=10;
        }
        while(k>0){
            a[k%10]++;
            k/=10;
        }
        for (int w=1;w<=9;w++){  //判断
            if(a[w]!=1) flag=1;
        }
        if(flag==0) printf("%d %d %d\n",o,p,q);  //输出
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yingyouyu/article/details/87904206
今日推荐