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

猜你喜欢

转载自www.cnblogs.com/expedition/p/12217495.html