1. 程式人生 > >三連擊java版和c語言版

三連擊java版和c語言版

原題地址:

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