| ||||||||||
| 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