我觉得自己的方法不咋地,只能适用于较简单的排列组合。
直接上题目和代码,之后有时间再改。
题目
自己的银行卡设置一个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
这题出得引人犯罪,把所有可能值都给出来,诱惑我打表(就是自己算出结果,然后简单写个输出程序,而不是让计算机去算出结果,一言以蔽之,聪明的流氓)。
我写的代码(仅供参考)
#include <iostream>
using 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)||(b<a&&b<c))&&(((e>f)&&(e>d))||((e<f)&&(e<d))))flag++; else continue;
if((100*(a-d)+10*(b-e)+c-f)%23==13)flag++; else continue;
if (flag == 6) { y[n] = a * 100000 + b * 10000 + c * 1000 + d * 100 + e * 10 + f; n++; }
}
}
}
}
}
long n1, n2;
cin >> 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 <<endl<< y[i]; i++; }
return 0;
}
为什么最后几行输出整的那么花里胡哨呢,因为他不让最后一行输出换行。
(未完待续......)