三連擊java版和c語言版
阿新 • • 發佈:2018-12-18
原題地址:
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清空陣列並跳出該順序,進入下一個迴圈。
遍歷的時候可以分兩種情況考慮:
- 內部:本身,二倍值,三倍值自身的個十百值是否重複。
- 外部:判斷二倍值和三倍值的個十百值是否跟前面出現過的值重複。
原始碼:
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