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