暴力破解【题解】
2024-06-10 15:24:10
发布于:上海
18阅读
0回复
0点赞
写在前面:
如果和我一样暴力破解的人们须知:
为了防止TLE,我们首先要想到以下内容:
1、循环范围
我们都知道,最开始试的密码是01234567,这也是我们循环开始的自变量i的初始值。
由于题目给的密码n是一个规范的密码,所以,直接把n作为循环上限即可。那么优化了循环范围还是会TLE怎么办?这时候就考虑到步长的问题了。
2、循环步长
如果个位和任意一位相等,+1就不相等了;
如果十位和任意高位相等,+10就不相等了;
如果百位和任意高位相等,+100就不想等了;
……
如果百万位和高位(千万位)相等,+1M就不相等了。也就是说,在循环中,我们可以优化的是循环的范围,以及循环时自变量i的变化步长。
上代码:
#include<iostream>
using namespace std;
typedef long long lld;
lld n;
int j=0;
int main(){
cin >> n;
for (lld i=1234567;i<n;i++){
int a=i%10,b=i/10%10,c=i/100%10,d=i/1000%10,e=i/10000%10,f=i/100000%10,g=i/1000000%10,h=i/10000000;
if (a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&d!=e&&d!=f&&d!=g&&d!=h&&e!=f&&e!=g&&e!=h&&f!=g&&f!=h&&g!=h) j++;
else if (b==c||b==d||b==e||b==f||b==g||b==h) i+=9;
else if (c==d||c==e||c==f||c==g||c==h) i+=99;
else if (d==e||d==f||d==g||d==h) i+=999;
else if (e==f||e==g||e==h) i+=9999;
else if (f==g||f==h) i+=99999;
else if (g==h) i+=999999;
}
cout << j+1 << endl;
return 0;
}
全部评论 1
没看懂
2024-06-21 来自 广东
0
有帮助,赞一个