zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        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
    ", num );
                            count = 0;
                        }
                        else
                            printf( "%d ", num );
                    }
        return 0;
    }
  • 相关阅读:
    跑步前后吃什么?
    英雄杀八人场心得
    如何判断JavaScript数据具体类型
    js实现时间日期的格式化
    各个公司前端笔试题回顾
    原型模式Prototype,constructor,__proto__详解
    二级菜单不同方法的实现
    秋招笔试碰到的疑难题目1
    php和mysql学习问题笔记
    es6学习笔记12--Class
  • 原文地址:https://www.cnblogs.com/expedition/p/12217495.html
Copyright © 2011-2022 走看看