P7379 [COCI2018-2019#6] Lun题解
zct_sky
·
·
题解
思路:
情况一: $x$ 在最后一位;
情况二: $x$ 不在最后一位。
如果是情况一,就按照题目直接计算 $x$ 。
如果是情况二,则从 $0 ∼ 9$ 枚举 $x$ ,再计算校验码,如果校验码等于最后一位,就输出 $x$ 。
### 代码:
```c++
#include<bits/stdc++.h>
using namespace std;
int l,x,b[110];
string a;
int main(){
cin>>l>>a;//输入
for(int i=0;i<l;i++)//找出哪一位是x,并把其余的数存进数组
if(a[i]=='x') x=i;
else b[i]=a[i]-'0';
if(x==l-1){//如果x是最后一位
int s=0;
bool f=(l-1)%2;
for(int i=0;i<l-1;i++){//计算x
if(f^(i%2)){
b[i]*=2;
int sum=0;
while(b[i]) sum+=b[i]%10,b[i]/=10;
s+=sum;
}else s+=b[i];
}
cout<<s*9%10;//输出
}else{//如果x不是最后一位
int s;
bool f=(l-1)%2;
for(int k=0;k<10;k++){//从0~9枚举x
s=0;
b[x]=k;
for(int i=0;i<l-1;i++){//计算校验码
if(f^(i%2)){
int t=b[i];
b[i]*=2;
int sum=0;
while(b[i]) sum+=b[i]%10,b[i]/=10;
b[i]=t;
s+=sum;
}else s+=b[i];
}
if(s*9%10==b[l-1]){//如果校验码等于最后一位,输出x
cout<<k;
return 0;
}
}
}
return 0;
}
```