給定不超過6的正整數A,考慮從A開始的連續4個數字。請輸出所有由它們組成的無重復數字的3位數。
輸入格式:
輸入在一行中給出A。
輸出格式:
輸出滿足條件的的3位數,要求從小到大,每行6個整數。整數間以空格分隔,但行末不能有多余空格。
輸入樣例:
2
輸出樣例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
【解析】
怎么說呢,感覺出題人玩的好6
簡而言之,最外層一個for循環,從n遍歷到n+3
每層遍歷,由兩個循環嵌套,外層循環找第二位數字,內層循環負責從4個數中找到沒有被選出的數字,即第三位數字
顯然,需要兩個數組,分別記憶已經做過第1,2位數的數字,和,記憶已經做過第1,第2,第3位的數字
#include<stdio.h> #include<string.h> int a[4]; int b[4] = {0}; //記憶做過第1,2,3位數的數字 int c[4] = {0}; //記憶做過第1,2位數的數字 int main(){ int n; scanf("%d",&n); for(int i = 0;i < 4;i++) a[i] = n+i; for(int i = n; i <= n+3;i++){ //最外層 n ~ n+3 的遍歷 b[i-n] = 1; //記憶做過第1位數的數字 c[i-n] = 1; //記憶做過第1位數的數字 int s = 3; int flag = 1; while(s--){ // 循環3次,找3個數 int j = 0; while(c[j] == 1){ //根據沒有做過第1,2位數的數字,選取當前的第2位數 j = (j+1)%4; //采用求模運算,從前往后游走數組,保證所得序列遞增 } b[j] = 1; //記憶做過第2位數的數字 int p = 2; while(p--){ //循環2次,找2個數 int k = 0; while(b[k] == 1 ){ k = (k+1)%4; } b[k] = 1; //記憶做過第3位數的數字 ,下次循環所得的就是從未用過的數字 if(flag == 1){ printf("%d%d%d",i,a[j],a[k]); flag = 0; } else printf(" %d%d%d",i,a[j],a[k]); } //234,235,243,245,253,254 //記得清零數組b,只記憶做過第一位數的數字 for(int h = 0;h <4;h++){ if(h != i- n ) b[h] = 0; } c[j] = 1; //讓數組c 記憶做過第2位數的數字,使23*,23……下次的第二位數沒有 被做為過第2位 } memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); printf("\n"); } return 0; }
【做法2】
感謝百度
#include <stdio.h> int main ( ) { int a; scanf( "%d", &a ); int num, i, j, k, count = 0; for( i = a; i <= a + 3; i++ ) for( j = a; j <= a + 3; j++ ) for( k = a; k <= a + 3; k++ ) if( ( i != j ) && ( i != k ) && ( j != k ) ){ num = i * 100 + j * 10 + k; count++; if( count == 6 ){ printf( "%d\n", num ); count = 0; } else printf( "%d ", num ); } return 0; }
