身份证--困惑


思路:首先弄懂

先把总的加权sum求出来,然后依次遍历,看第几个求出来的修正值与原本的值不相等
原始代码(有一点错误,但我不理解
#include<stdio.h>
#define ll long long
int main(){int T;scanf("%d",&T);while(T--){char ID[20];int id[20];scanf("%s",ID);for(int i=0;i<18;i++){id[i]=(i==17&&ID[i]=='X') ? 10 : (ID[i]-'0');}//转换为整数型数组ll sum =0;for(int i=0;i<18;i++){sum+=(ll)id[i]*(1<<(17-i));}for(int i=0;i<18;i++){ll w=1<<(17-i);ll t=sum-(ll)id[i]*w;int ans=0;ll tt;int max_b=(i<17)?9:10;for(ans=0;ans<=max_b;ans++){tt=t+ans*w;if(tt%11==1) {break;}}if(tt==id[i]||(ans==10&&i<17)){printf("-");}else{if(ans==10){printf("X");}else{printf("%d",ans);}}}printf("\n");}
}AC代码
#include<stdio.h>
#define ll long long
int main(){int T;scanf("%d",&T);while(T--){char ID[20];int id[20];scanf("%s",ID);for(int i=0;i<18;i++){id[i]=(i==17&&ID[i]=='X') ? 10 : (ID[i]-'0');}//转换为整数型数组ll sum =0;for(int i=0;i<18;i++){sum+=(ll)id[i]*(1<<(17-i));}for(int i=0;i<18;i++){ll w=1<<(17-i);ll t=sum-(ll)id[i]*w;int ans=0;ll tt;int max_b=(i<17)?9:10;for(ans=0;ans<=max_b;ans++){tt=t+ans*w;if(tt%11==1) {break;}}if(ans == id[i] || (ans == 10 && i<17)) printf("-");else if(ans == 10) printf("X");else printf("%d", ans);}printf("\n");}
}有两点困惑:
1.AC代码第三十行
if(ans == id[i] || (ans == 10 && i<17)) printf("-");(ans == 10 && i<17)这个条件是我按照样例2写出来的,但是我不明白它的逻辑,i<17不是设置了最大值是9吗
2.原始代码和AC代码的输出地方,原始代码else不应该包括了
else if(ans == 10) printf("X");
else printf("%d", ans);
这俩个吗
