Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
关于题目意思/*题目意思太难理解。 看了数据和标程大致知道了什么意思。 题目意思是按照xxx#yyyyy#的模式,把xxx当作权,看看yyyy是不是合法的数字,如果是的话就转化,继续下一轮的判断 例如3#12##1#,先判断3#12#是合法的,值是5,然后判断5#1# 这题要注意判断的几点是,输入中有可能出现大写的A到F的字母,这种情况是不合法的,只能出现数字和a到f。 第二点就是#号的匹配,我是分为有#号和没#号的判断。 有#号的情况必须是最后一个是#号,第一个不能是#号,中间有很多对相个相聆的#号,如#xxx#是不合法的。 xxx#yy##zz#是合法的。 然后是判断权,权的值只能是2到16之间的值。第一个数字的权值是10 */ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAX=88; char s[MAX]; char num[MAX][MAX]; int getval(char x) { if(x>='0'&&x<='9')return x-'0'; return x-'a'+10; } int getb(char s[],int b) { int i,ret=0; for(i=0;s[i]&&ret<=16;i++) { int tmp=getval(s[i]); if(tmp>=b)return -1;//超出权值,返回-1 ret=ret*b+tmp; } if(ret>16)return 17; return ret; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",s); int i; //判断是否只含数字井号和a到f的字符 for(i=0;s[i];i++) { if(s[i]=='#')continue; if(s[i]>='0'&&s[i]<='9')continue; if(s[i]>='a'&&s[i]<='f')continue; break; } if(s[i]) { puts("no"); continue; } //end int n=0,j; int cnt=0,len; //数#号个数 for(i=0;s[i];i++) { if(s[i]=='#')cnt++; } len=strlen(s); //把里面的数字分解出来 for(i=0;i<len;i++) { if(s[i]!='#') { j=0; while(i<len&&s[i]!='#') { num[n][j++]=s[i]; i++; } if(s[i]!='#')i--; num[n][j]=0; n++; } } //end //判断#号个数, if(cnt!=(n-1)*2) { puts("no"); continue; } //判断#号匹配 if(cnt>0) { if(s[i-1]!='#') { puts("no"); continue; } else if(s[0]=='#') { puts("no"); continue; } len=strlen(s); for(i=0;i+2<len;i++) { if(s[i]=='#'&&s[i+1]=='#'&&s[i+2]=='#') { break; } } if(i+2<len) { puts("no"); continue; } for(i=0;i+1<len;i++) { if(s[i]=='#'&&s[i+1]=='#') { cnt-=2; } } if(cnt!=2) { puts("no"); continue; } } //end int b; if(n==0) { puts("yes"); continue; } //只能一个数字 if(n==1) { //直接转化 b=getb(num[0],10); if(b==-1) { puts("no"); } else { puts("yes"); } continue; } b=getb(num[0],10); //判断权值是否合法 if(b>16||b<2) { puts("no"); continue; } //将后面的转化成对应的数字 for(i=1;i+1<n;i++) { b=getb(num[i],b); if(b==-1)break; if(b>16||b<2){break;} } if(i+1<n) { puts("no"); continue; } //判断最后一个数字的每一位是否超出权值 for(j=0;num[i][j];j++) { int tmp=getval(num[i][j]); if(tmp>=b)break; } if(num[i][j]!=0) { puts("no"); } else puts("yes"); } return 0; } /* */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator