语言 7"/>
C语言 7
传说魔镜可以把任何接触镜面的东西变成原来的两倍,不过增加的那部分是反的。例如,对于字符串XY,若把Y端接触镜面,则魔镜会把这个字符串变为XYYX;若再用X端接触镜面,则会变成XYYXXYYX。对于一个最终得到的字符串(可能未接触魔镜),请输出没使用魔镜之前,该字符串最初可能的最小长度。
输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个字符串(长度小于100,且由大写英文字母构成)。
输出格式:
对于每组测试数据,在一行上输出一个整数,表示没使用魔镜前,最初字符串可能的最小长度。
输入样例:
XYYXXYYX
XYXX
输出样例:
2
4
#include <stdio.h>
#include <string.h>
#include <math.h>
void nixu(char *a);int main()
{char a[101], b[101], c[101], *pa; //a是原数组,b用来进行比较,c用来保留a的原型int i, n, count; //n存放字符串长度,count代表魔镜做了几次while(scanf("%s", a) != -1) //按照提议输入字符串,处理到文件尾{strcpy(c, a); //把a复制给c备用strcpy(b, a); //把a复制给b比较count = 0; //给count赋初值while(strcmp(a,b) == 0) //当a和b字符串相等时,循环继续{n = strlen(a); //求出字符串长度pa = a+n/2; //找到指针pa从a字符数组中间截断的位置strcpy(b, pa); //把从pa位置以后的字符串复制到b字符数组上*pa = '\0'; //再给a字符数组前半段加上结束标志nixu(b); //调取函数逆序摆放bcount++; //计数加一,循环结束count会多加一次}int q = pow(2,count - 1); //用减半的次数来算出长度的倍数printf("%d\n",strlen(c)/q); //用总长度减去倍数,就得到了最短长度}}
void nixu(char *a) //逆序字符数组的函数,之前的题有出现过
{int n = strlen(a);char *pa, *pb;for(pa = a, pb = a+n-1; pa < pb; pa++,pb--){char m = *pa;*pa = *pb;*pb = m;}
}
更多推荐
C语言 7
发布评论