首页 > 代码库 > NYOJ 34 韩信点兵
NYOJ 34 韩信点兵
韩信点兵
时间限制:3000 ms | 内存限制:65535 KB
难度:1
- 描述
- 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
- 输入
- 输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5
- 输出
- 输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89
- 样例输入
-
2 1 6
- 样例输出
-
41
解题思路:如果这个串的长度是奇数,那么这个串就不可能是经过镜面对称得来的,所以串的最小长度就是它本身,如果串是偶数,还要讨论一种情况,如AB,第一个与第二个不一样,那么二就是最小串,若长度为2,但是串为AA,则最小串长为1.
可以分为:
先看这个串长是否为2,如果是,看第一个字符与第二个是否相等,如果不相等,输出2,接下来判断串长是否为奇数,如果是奇数,输出字符串的长度就是答案,其他情况,将串对半劈开进行对应位置的比较,d=1,劈成两半的串有不对称的地方,出现这种情况,就输出当前串长的二倍。
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[100]; 6 int i,len,temp,num; 7 scanf("%d",&num);//num组测试数据 8 getchar();//用于接收空格 9 while(num--) 10 { 11 gets(a); 12 len=strlen(a); 13 while(1) 14 { 15 if(len==2&&a[0]!=a[1])//串长为2,且两个字符不一样,输出串长为2 16 { 17 printf("2\n"); 18 break; 19 } 20 else if(len%2!=0)//如果串长为奇数,串不可能是镜面对称得来的,直接输出长度 21 { 22 printf("%d\n",len); 23 break; 24 } 25 else 26 { 27 int d=0; 28 len=len/2;//将串对半劈开,进行比较 29 for(i=0;i<len;i++) 30 if(a[i]!=a[2*len-i-1]) 31 { 32 d=1;//代表中间有不对称的地方 33 break; 34 } 35 if(d==1) 36 { 37 printf("%d\n",2*len);//d为1代表串不是镜面对称的,结束循环,输出答案 38 break; 39 } 40 } 41 } 42 } 43 return 0; 44 }
NYOJ 34 韩信点兵
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。