一篇意义不明的代码保存+题解
2025-07-04 16:50:47
发布于:上海
#include<bits/stdc++.h>
using namespace std;
bool used[10]; // 标记数字0-9是否已被使用
// 计算排列数:从n个元素中取k个的排列数 (n!/(n-k)!)
long long cnt(int n,int k){
long long ans=1;
for(int i=n-k+1;i<=n;i++) // 连乘k次实现排列计算
ans*=i;
return ans;
}
int main(){
// 文件重定向
freopen("run.in","r",stdin);
freopen("run.out","w",stdout);
string s;
cin>>s; // 读入8位密码字符串
long long ans=0; // 累计尝试次数
// 逐位处理密码
for(int i=0;i<8;i++){
int digit=s[i]-'0'; // 当前位数字
// 统计比当前数字小且未使用的数字的组合数
for(int d=0;d<digit;d++)
if(!used[d]) // 如果数字d未被使用
ans+=cnt(9-i,7-i); // 计算剩余位排列可能性
used[digit]=1; // 标记当前数字已使用
}
cout<<ans+1; // +1是因为当前尝试的密码本身也算一次
// 关闭文件流
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也
有帮助,赞一个