我觉得自己的方法不咋地,只能适用于较简单的排列组合。
直接上题目和代码,之后有时间再改。
题目
自己的银行卡设置一个6位数字的密码,应符合如下规则: (1)左侧数第1,3,5位数字为奇数; (2)左侧数第2,4,6位数字为偶数; (3)任意两位数字不相同; (4)中间两位不是月份(不在1-12之间),后两位不是日期(不在1-31之间); (5)前三位非升序非降序排列,后三位非升序非降序排列; (6) 前三位与后三位之差被23整除余13。 请编程输入两个六位整数a,b, 输出区间[a,b]之间所有符合条件的密码。输入样例:
100000 999999结尾无空行
输出样例:
307294 385096 387052 523096 529470 549076 563274 581476 583294 587436 705692 725436 769250 781492 785496 785634 901658 903476 923450 927638 947658
这题出得引人犯罪,把所有可能值都给出来,诱惑我打表(就是自己算出结果,然后简单写个输出程序,而不是让计算机去算出结果,一言以蔽之,聪明的流氓)。
我写的代码(仅供参考)
#includeusing namespace std; int main() { long x[6],y[40],a, b, c, d, e, f,flag; int n = 0; for (a = 1; a < 10; a += 2) { for (b = 0; b < 9; b += 2) { for (c = 1; c < 10; c += 2) { for (d = 0; d < 9; d += 2) { for (e = 3; e < 10; e += 2) for (f = 0; f < 9; f += 2) { flag = 0; if (a != c && c != e && e != a)flag++; else continue; if (b != d && d != f && f != b)flag++; else continue; if (10 * c + d > 12)flag++; else continue; if (e * 10 + f > 31)flag++; else continue; if(((b>a&&b>c)||(bf)&&(e>d))||((e > n1 >> n2; int i = 0; for(i=0;i<22;i++) { if (y[i] >= n1 && y[i] <= n2) { cout<< y[i]; i++; break ;} } while (y[i] >=n1 && y[i] <= n2) { cout < 为什么最后几行输出整的那么花里胡哨呢,因为他不让最后一行输出换行。
(未完待续......)



