【听说有人想转码】初探排列组合(数组)

我觉得自己的方法不咋地,只能适用于较简单的排列组合。

直接上题目和代码,之后有时间再改。

题目

自己的银行卡设置一个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;
}

为什么最后几行输出整的那么花里胡哨呢,因为他不让最后一行输出换行。

(未完待续......)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值