PTA——7-16 求符合給定條件的整數集 (15分)


題目地址

給定不超過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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM