题解

83 条题解

  • 0
    @ 2020-01-24 13:52:12

    仅供参考
    #include<iostream>
    using namespace std;
    int main()
    {
    for (int i=123;i<329;i++)
    {
    int pd=1;
    int x=i;int y=x*2;int z=x*3;
    int x1=x;int y1=y;int z1=z;
    int a[9];
    a[0]=x%10;x/=10;a[1]=x%10;x/=10;a[2]=x%10;
    a[3]=y%10;y/=10;a[4]=y%10;y/=10;a[5]=y%10;
    a[6]=z%10;z/=10;a[7]=z%10;z/=10;a[8]=z%10;
    for (int k=0;k<8;k++)
    {
    for (int j=k+1;j<9;j++)
    {
    if (a[k]==a[j]){pd=0;}
    if (a[j]==0){pd=0;}
    }
    }
    if (pd==1)cout<<x1<<' '<<y1<<' '<<z1<<endl;
    }
    }

  • 0
    @ 2019-12-25 22:52:26

    用一个bool的数组记录每次是不是9个不同的数,然后检查i=123到329。

    memset需要用到string.h,实现起来更快,不然需要跑一个for loop来重置arr里的值。
    ```cpp
    #include <iostream>
    #include <cstring>
    using namespace std;

    bool arr[9];

    bool check(int n) {
    for (int i = 0; i < 3; i++) {
    int x = n % 10;
    if (x != 0 && !arr[x - 1]) {
    arr[x - 1] = 1;
    }
    else
    return 0;
    n /= 10;
    }
    return 1;
    }

    int main(int argc, char *argv[]) {
    for (int i = 123; i <= 329; i++) {
    memset(arr, 0, 9);
    if (check(i) && check(2 * i) && check(3 * i))
    printf("%d %d %d\n", i, 2 * i, 3 * i);
    }
    return 0;
    }

  • 0
    @ 2019-08-23 16:42:33

    这题 最暴力的算法是:

    枚举每个位数上的所有可能。时间复杂度为\(9^9‬=‭387420489‬\),这显然不行,中间的剪枝加了可能优化为\(9!\)能过。

    但是,我们完全可以枚举第一个数。出于重复的考虑,第一个数在\(123\)和\(333\)之间。然后算出第二、三个数,一波验证即可。

    #include<bits/stdc++.h>
    using namespace std;
    
    inline bool check(int x,int y,int z) {
        int h[10]={0};
        while(x) h[x%10]++,x/=10;
        while(y) h[y%10]++,y/=10;
        while(z) h[z%10]++,z/=10;
        for(int i=1;i<=9;i++) if(h[i]!=1) return 0;
        return 1;
    }
    
    int main(){
        for(int i=123;i<=333;i++)
            if(check(i,2*i,3*i)) printf("%d %d %d\n",i,2*i,3*i);
        return 0;
    }
    
    

    给个赞!

  • 0
    @ 2019-08-01 21:53:44

    ##python
    ##验证的难度往往小于求解!!

    for i in range(123, 329):
    num_1 = i
    num_2 = 2 * i
    num_3 = 3 * i
    str_123 = str(num_1) + str(num_2) + str(num_3)
    set_123 = set(str_123)
    list_123 = list(set_123)
    if (len(list_123) == 9) and ('0' not in list_123):
    out_put = str(num_1) + ' ' + str(num_2) + ' ' + str(num_3)
    print(out_put)

  • 0
    @ 2019-07-26 18:21:03

    暴力枚举法:

    #include<iostream>
    using namespace std;
    int a[350],b[350],c[350];
    void f(int x,int y,int z);
    int main()
    {
        int n=100,t=1;
        while(n*3<1000)
        {
            a[t]=n*1;
            b[t]=n*2;
            c[t]=n*3;
            t++;
            n++;
        }
        for(int i=1;i<=n;i++)
          f(a[i],b[i],c[i]);
        return 0;
    }
    void f(int x,int y,int z)
    {
        int j[10]={0,0,0,0,0,0,0,0,0,0};
        int x1=x,y1=y,z1=z;
        for(int i=1;i<=3;i++)
        {
            j[x1%10]++;j[y1%10]++;j[z1%10]++;
            x1=(x1-x1%10)/10;
            y1=(y1-y1%10)/10;
            z1=(z1-z1%10)/10;
        }
        for(int i=1;i<=9;i++)
              if(j[i]>1||j[i]==0)  return;
        cout<<x<<" "<<y<<" "<<z<<endl;
    }
    
  • 0
    @ 2019-05-21 13:22:48

    #include<iostream>
    using namespace std;
    int main(){
    cout<<"192 "<<"384 "<<"576"<<endl<<"219 "<<"438 "<<"657"<<endl<<"273 "<<"546 "<<"819"<<endl<<"327 "<<"654 "<<"981"<<endl;
    return 0;
    }

  • 0
    @ 2019-03-07 22:02:10

    ~~你们太菜啦~~
    #include<iostream>
    #include<cstring>
    using namespace std;
    bool used[10];
    int main(){
    for(int i = 100; i <= 999; i ++){
    int o = i * 1, oo = o;
    int j = i * 2, p = j;
    int k = i * 3, q = k;
    memset(used, false, sizeof(used));
    bool flag = false;
    while(o != 0){
    int s = o % 10;
    if(!used[s] && s != 0) used[s] = true;
    else {
    flag = true;
    break;
    }
    o /= 10;
    }
    if(flag) continue;
    flag = false;
    while(j != 0){
    int s = j % 10;
    if(!used[s] && s != 0) used[s] = true;
    else {
    flag = true;
    break;
    }
    j /= 10;
    }
    if(flag) continue;
    flag = false;
    while(k != 0){
    int s = k % 10;
    if(!used[s] && s != 0) used[s] = true;
    else {
    flag = true;
    break;
    }
    k /= 10;
    }
    if(flag) continue;
    if(p <= 999 && q <= 999){
    cout << oo << ' ' << p << ' ' << q << endl;
    }
    }
    return 0;
    }

  • 0
    @ 2019-02-04 09:42:52

    利用集合做的

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    #include <set>
    using namespace std;
    int a,b,c,i,j,k,i1,i2,j1,j2,k1,k2;
    void insertAll(set<int> &s){
        s.insert(i),s.insert(j),s.insert(k);
        s.insert(i1),s.insert(j1),s.insert(k1);
        s.insert(i2),s.insert(j2),s.insert(k2);
    }
    int main(){
        for(i=1; i<4; i++){
            for(j=1;j<=9;j++){
                for(k=1;k<=9;k++){
                    if(k!=i && k!=j && i!=j){
                        set<int> s;
                        a = i*100+j*10+k;
                        b = a*2; c = a*3;
                        if(c>=1000) break;
                        i1 = b/100; j1 = b%100/10; k1 = b%10;
                        i2 = c/100; j2 = c%100/10; k2 = c%10;
                        insertAll(s);
                        if(s.size()==9&&!s.count(0)){
                            printf("%d %d %d\n",a,b,c);
                        }
                    }
                }
            }
        }
    }
    
  • 0
    @ 2018-09-02 18:29:48

    致小白

  • 0
    @ 2018-08-27 15:56:55

    #include<cstdio>
    using namespace std;
    int a[10],book[10],n1,n2,n3;
    void output(){
    n1=a[1]*100+a[2]*10+a[3];
    n2=a[4]*100+a[5]*10+a[6];
    n3=a[7]*100+a[8]*10+a[9];
    if(n1*2==n2&&n1*3==n3)
    printf("%d %d %d\n",n1,n2,n3);
    return;
    }
    void dfs(int step){
    int i;
    if(step>9)output();
    for(i=1;i<=9;i++){
    if(book[i]==0){
    book[i]=1;
    a[step]=i;
    dfs(step+1);
    book[i]=0;
    }
    }
    }
    int main(){
    dfs(1);
    return 0;
    }

  • 0
    @ 2018-07-18 15:07:52

    #include<iostream>
    using namespace std;
    bool test(int x) //判断当前数是否由1~9构成
    {
    int a[10]={0};
    while(x)
    {
    a[x%10]++;
    x/=10;
    }
    for(int i=1;i<=9;i++)
    if(a[i]!=1) return false;
    return true;
    }
    int main()
    {
    int a,b,c,d;
    for(int i=1;i<=333;i++) //保证生成的三数比为1:2:3
    {
    a=i*1,b=i*2,c=i*3;
    d=a*1000000+b*1000+c;
    if(test(d)) cout<<a<<" "<<b<<" "<<c<<endl;
    }
    return 0;
    }

  • 0
    @ 2018-07-10 17:36:55

    直接用C++的全排列函数next_permutation,然后超过333不可能直接跳出

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        do{
    //      for(int i = 0; i < 9; ++i) printf("%d ", arr[i]);
    //      printf("\n");
    
            int num[3];
            for(int i = 0;i < 3; ++i)
            {
                num[i] = arr[3 * i] * 100 + arr[3 * i + 1] * 10 + arr[3 * i + 2]; 
            }
            
            if(num[0] > 333) break;
            
            if(num[0] * 2 == num[1] && num[0] * 3 == num[2]) printf("%d %d %d\n", num[0], num[1], num[2]);
        }while(next_permutation(arr, arr + 9));
        return 0;
    }
    
  • 0
    @ 2018-06-11 08:41:42

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int mark[10];
    int main(){
    for(int i=111;i<=333;i++){
    for(int i=0;i<=9;i++)mark[i]=0;
    int a1=i;
    int a2=i*2;
    int a3=i*3;
    if(mark[a1%10])continue;
    mark[a1%10]=1;
    if(mark[a1/10%10])continue;
    mark[a1/10%10]=1;
    if(mark[a1/100%10])continue;
    mark[a1/100%10]=1;
    if(mark[a2%10])continue;
    mark[a2%10]=1;
    if(mark[a2/10%10])continue;
    mark[a2/10%10]=1;
    if(mark[a2/100%10])continue;
    mark[a2/100%10];
    if(mark[a3%10])continue;
    mark[a3%10];
    if(mark[a3/10%10])continue;
    mark[a3/10%10]=1;
    if(mark[a3/100%10])continue;
    mark[a3/100%10]=1;
    if(mark[0]==1)continue;
    printf("%d %d %d\n",a1,a2,a3);
    }
    return 0;
    }

  • 0
    @ 2018-04-27 15:40:11

    #include <iostream>
    #include <algorithm>
    int a0[9]={'1','2','3','4','5','6','7','8','9'};int Now[1005];int Count=0;
    using namespace std;
    bool Check(int a,int b,int c)
    {int K=0,op[9],bis;
    while(a!=0)
    {
    op[K]=a%10;
    a/=10;
    K++;
    }
    while(b!=0)
    {
    op[K]=b%10;
    b/=10;
    K++;
    }
    while(c!=0)
    {
    op[K]=c%10;
    c/=10;
    K++;
    }
    for(int a=0;a<9;a++)
    for(int b=a+1;b<9;b++)
    {
    if(op[a]==op[b])
    return 0;
    }
    return 1;
    }
    int main()
    {
    for(int a=1;a<10;a++)
    for(int b=1;b<10;b++)
    for(int c=1;c<10;c++)
    if(a!=b&&b!=c&&c!=a)
    {
    Now[Count]=a*100+b*10+c;
    Count++;
    }
    sort(Now,Now+1003);
    for(int a=0;a<1005;a++)
    for(int b=0;b<1005;b++)
    for(int c=0;c<1005;c++)
    if(Now[a]*2==Now[b]&&Now[a]*3==Now[c]&&Now[a]!=0)
    {
    if(Check(Now[a],Now[b],Now[c]))
    cout<<Now[a]<<" "<<Now[b]<<" "<<Now[c]<<endl;
    }
    }

  • 0
    @ 2018-04-21 22:37:35

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;

    int cmp(int a[9], int b[9])
    {
    int p;
    for(int x=0; x<9; x++)
    {
    p=1;
    if(a[x] != b[x])
    p=0;
    }
    if(p=1)
    return 0;

    else
    return 1;

    }

    int main ()

    {

    int i, j, k;
    int a1[9]={1,2,3,4,5,6,7,8,9}, a2[9], b[3];

    for(i=123; i<=329; i++)
    {
    j = 2*i;
    k = 3*i;
    b[0] = i;
    b[1] = j;
    b[2] = k;
    for(int n=0, m=0; n<3; n++)
    {
    a2[m] = b[n]/100;
    a2[m+1] = b[n]/10%10;
    a2[m+2] = b[n]%10;
    m += 3;
    }
    sort(a2, a2+9);

    int p=0;
    for(int x=0; x<9; x++)
    {
    if(a2[x] != a1[x])
    {
    p=1;
    break;
    }
    }
    if(p == 0)
    printf("%d %d %d\n", i, j, k);
    }

    }

  • 0
    @ 2018-04-08 16:20:56

    java来一波

    import java.util.Arrays;
    import java.util.HashMap;
    
    
    public class Main {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //A[1]=1则表示1这个数字使用过
            int[] A=new int[10];
            //关键是满足1:2:3这个比例关系
            for(int i=100;i<334;++i){
                //每趟循环前均置0
                Arrays.fill(A, 0);
                int p=i;
                int q=2*i;
                int r=3*i;
                //需要判断数字0没有出现过,否则会多出267 534 801这一组
                if(judge(A,p)&&judge(A,q)&&judge(A,r)&&A[0]==0){
                    System.out.println(p+" "+q+" "+r);
                }
            }
        }
        //将一个三位数的每一位的信息存在A中
        public static boolean judge(int[] A,int number){
            while(number>0){
                int tmp=number%10;
                if(A[tmp]==0){//未出现过则置1
                    A[tmp]=1;
                }
                else{//出现过
                    return false;
                }
                number/=10;
            }
            return true;
        }
    }
    
    
    
  • 0
    @ 2018-04-02 13:19:50

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
    int r,j;
    for (int i=123;i<=987;i++)
    {
    if ((i%10!=i/100)&&(i%10!=(i-i/100*100)/10)&&(i/100!=(i-i/100*100)/10))
    {
    j=i*2;
    r=i*3;
    if (r<=987&&r==j*1.5&&(j%10!=j/100)&&(j%10!=(j-j/100*100)/10)&&(j/100!=(j-j/100*100)/10)&&(r%10!=r/100)&&(r%10!=(r-r/100*100)/10)&&(r/100!=(r-r/100*100)/10)&&j/100!=i/100&&j/100!=i%10&&j/100!=(i-i/100*100)/10&&r/100!=i/100&&r/100!=i%10&&r/100!=(i-i/100*100)/10&&j/100!=r/100&&j/100!=r%10&&j/100!=(r-r/100*100)/10&&j%10!=i/100&&j%10!=i%10&&j%10!=(i-i/100*100)/10&&r%10!=i/100&&r%10!=i%10&&r%10!=(i-i/100*100)/10&&j%10!=r/100&&j%10!=r%10&&j%10!=(r-r/100*100)/10&&(j-j/100*100)/10!=r/100&&(j-j/100*100)/10!=r%10&&(j-j/100*100)/10!=(r-r/100*100)/10&&(j-j/100*100)/10!=i/100&&(j-j/100*100)/10!=i%10&&(j-j/100*100)/10!=(i-i/100*100)/10&&j%10!=0&&j/100!=0&&(j-j/100*100)/10!=0&&r%10!=0&&r/100!=0&&(r-r/100*100)/10!=0&&i%10!=0&&i/100!=0&&(i-i/100*100)/10!=0)
    {
    cout<<i<<" "<<j<<" "<<r<<endl;
    }
    }
    }
    return 0;
    }

  • 0
    @ 2018-04-02 13:15:56

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
    int r;
    for (int i=123;i<=987;i++)
    {
    if ((i%10!=i/100)&&(i%10!=(i-i/100*100)/10)&&(i/100!=(i-i/100*100)/10))
    {
    for (int j=2*i;j<=987;j+=i)
    {
    r=i*3;
    if (r<=987&&r==j*1.5&&(j%10!=j/100)&&(j%10!=(j-j/100*100)/10)&&(j/100!=(j-j/100*100)/10)&&(r%10!=r/100)&&(r%10!=(r-r/100*100)/10)&&(r/100!=(r-r/100*100)/10)&&j/100!=i/100&&j/100!=i%10&&j/100!=(i-i/100*100)/10&&r/100!=i/100&&r/100!=i%10&&r/100!=(i-i/100*100)/10&&j/100!=r/100&&j/100!=r%10&&j/100!=(r-r/100*100)/10&&j%10!=i/100&&j%10!=i%10&&j%10!=(i-i/100*100)/10&&r%10!=i/100&&r%10!=i%10&&r%10!=(i-i/100*100)/10&&j%10!=r/100&&j%10!=r%10&&j%10!=(r-r/100*100)/10&&(j-j/100*100)/10!=r/100&&(j-j/100*100)/10!=r%10&&(j-j/100*100)/10!=(r-r/100*100)/10&&(j-j/100*100)/10!=i/100&&(j-j/100*100)/10!=i%10&&(j-j/100*100)/10!=(i-i/100*100)/10&&j%10!=0&&j/100!=0&&(j-j/100*100)/10!=0&&r%10!=0&&r/100!=0&&(r-r/100*100)/10!=0&&i%10!=0&&i/100!=0&&(i-i/100*100)/10!=0)
    {
    cout<<i<<" "<<j<<" "<<r<<endl;
    }
    }
    }
    }
    return 0;
    }
    if语句中,全为判断

  • 0
    @ 2018-03-25 18:56:02

    太水了,来一波恶心的……

    #include<bits/stdc++.h>
    using namespace std ;
    //Vijos P1772
    
    int main()
    {
        printf("192 384 576\n219 438 657\n273 546 819\n327 654 981") ;
        return 0 ;
    }
    

    有一道题目是输入三个数的比例在输出,这才有意思,大家不妨去找来坐坐。

  • 0
    @ 2018-03-01 11:10:31
    import java.util.HashSet;
    import java.util.Set;
    
    public class Main {
        public static void main(String[] args){
            for(int i=123;i<330;i++){
                int a = i;
                int b = i * 2;
                int c = i * 3;
                if(confirm(String.valueOf(a), String.valueOf(b), String.valueOf(c))){
                    System.out.println(a+" "+b+" "+c);
                }
            }
        }
        
        private static boolean confirm(String a, String b, String c){
            Set<String> set = new HashSet<String>();
            for(int i=0;i<3;i ++){
                set.add(a.substring(0, 1));
                set.add(b.substring(0, 1));
                set.add(c.substring(0, 1));
                a = a.substring(1);
                b = b.substring(1);
                c = c.substring(1);
            }
            if(set.size() == 9 && !set.contains("0")){
                return true;
            }else{
                return false;
            }
        }
    }
    
    

信息

ID
1772
难度
2
分类
搜索 点击显示
标签
递交数
2629
已通过
1270
通过率
48%
被复制
24
上传者