1 条题解

  • 0
    @ 2025-8-24 22:29:18

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zct_sky
    sto @jxbe6666 orz || 再起不能

    搬运于2025-08-24 22:29:18,当前版本为作者最后更新于2021-11-29 18:06:37,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路:

    xx 有两种情况:

    情况一: xx 在最后一位;

    情况二: xx 不在最后一位。

    如果是情况一,就按照题目直接计算 xx

    如果是情况二,则从 090 ∼ 9 枚举 xx ,再计算校验码,如果校验码等于最后一位,就输出 xx

    代码:

    #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; 
    }
    
    • 1

    信息

    ID
    6480
    时间
    1000ms
    内存
    64MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者