三连击java版和c语言版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/83618562

原题地址:

https://www.luogu.org/problemnew/show/P1008

这道题,虽然是新手村题目,但是感觉对新手很不友好,既然是新手村题目,那么一定是可以用暴力来解决的。

java版思路:
可用数字1~9 注意不包括0。
注意最后一行不需要换行。
创建一个数组存储,下标为1~9,存储值为0或1(0未调用,1已调用)。
遍历所有范围(最大值987,最小值为987 / 3=329)。
每次遍历获取2倍值和三倍值,获取二倍值三倍值的个十百值,从数组中判断是否为0,如果0则继续,如果1清空数组并跳出该顺序,进入下一个循环。
遍历的时候可以分两种情况考虑:

  1. 内部:本身,二倍值,三倍值自身的个十百值是否重复。
  2. 外部:判断二倍值和三倍值的个十百值是否跟前面出现过的值重复。

源码:

public class Main {
    public static void main(String args[]){
        int num = 987 / 3;//329
        int[] isUse = {0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
        int two = 0, three = 0;
        int j = 0;
        for (int i = 123; i < num; i++) {
            two = i * 2;
            three = i * 3;
            if((i / 100) ==((i / 10) % 10) ||(i / 100) ==(i % 10) ||((i / 10) % 10)==(i % 10) ||(i/100)==0||((i / 10) % 10)==0||(i % 10)==0){
                continue;
            }
            if((two / 100) ==((two / 10) % 10) ||(two / 100) ==(two % 10) ||((two / 10) % 10)==(two % 10) ||(two/100)==0||((two / 10) % 10)==0||(two % 10)==0){
                continue;
            }
            if((three / 100) ==((three / 10) % 10) ||(three / 100) ==(three % 10) ||((three / 10) % 10)==(three % 10)||(three/100)==0||((three / 10) % 10)==0||(three % 10)==0){
                continue;
            }
            isUse[i / 100] = 1;
            isUse[(i / 10) % 10] = 1;
            isUse[i % 10] = 1;
            if (isUse[two / 100] == 1 || isUse[(two / 10) % 10] == 1 || isUse[two % 10] == 1) {
                isUse[i / 100] = 0;
                isUse[(i / 10) % 10] = 0;
                isUse[i % 10] = 0;
                continue;
            } else {
                isUse[two / 100] = 1;
                isUse[(two / 10) % 10] = 1;
                isUse[two % 10] = 1;
            }
            if (isUse[three / 100] != 1 && isUse[(three / 10) % 10] != 1 && isUse[three % 10] != 1) {
                if(j!=0){
                    System.out.println();
                }
                j++;
                System.out.print(i+" "+two+" "+three);
            }
            isUse[i / 100] = 0;
            isUse[(i / 10) % 10] = 0;
            isUse[i % 10] = 0;
            isUse[two / 100] = 0;
            isUse[(two / 10) % 10] = 0;
            isUse[two % 10] = 0;
        }
    }
}

**c语言版:**看了别人的,很技巧,一看就懂。

#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;
}

结果输出:

192 384 576
219 438 657
273 546 819
327 654 981

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/83618562