回 帖 发 新 帖 刷新版面

主题:国王的魔镜

国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。
比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。
给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。[em2]

回复列表 (共9个回复)

沙发

由于只用边上接触“魔镜”,所以只要
1. 首先判断项链的长度是不是偶数,如果不是直接输出其长度并结束程序。
2. 从1到length div 2来判断a[i]=a[length+1-i]是否相等,如果不等直接输出其长度并结束程序。
3. 如果相等那么length:=length div 2,回到1重复执行程序。

板凳

由于是这样的规则,所以无论怎么变,
当把AB变成1和0是会惊奇地发现初最初的项链,
其他有0和1组成的数字都是回文数,
由此判断,
不停的把项链在满足左边一半和右边一半相等的情况下折成相等的两段,
直至无法再折为止。
如:ABBAABBA
按不停的把项链在满足左边一半和右边一半相等的情况下折成相等的两段的规则剪段
则变成:ABBA,再次剪段,变成AB,发现无法再剪时输出AB,
结束程序

3 楼

程序:
program magic                      //程序名。
var                                //定义。
 a,b,n:string;                     //定义a,b,c变量为字符串型。
 c:boolean;                        //定义c变量为布尔型。
 i:integer;                        //定义i变量为长整型。
begin                              //主程序开始。
 readln(n);                        //键盘输入字符串n。
 repeat                            //直到循环开始。
  c:=false;                        //定义c值为假。
  if length(n) mod 2 = 0 then      //判断n长度是否是偶数。
   begin                           //是偶数就进入程序。
    c:=true;                       //定义c为真。
    for i:=1 to length(n) div 2 do //计数循环,从1到n的长度整除2.
     if copy(n,i,1) <> copy(n,length(n)+1-i,1) then c:=false;//判断两遍是否吻合,否c为假。
    if c:=true then n:=copy(n,1,length(n) div 2);//如果c为真,n就去掉一半。 
   end;                            //子程序结束。
 until c=true;                     //直到c为真,推出循环。
 writeln(length(n));               //输出n的长度。
end.                               //程序结束。
   

4 楼

我顶你,杜子豪

5 楼

好,我顶

6 楼

有点错
program magic(这里;)                      //程序名。
var                                //定义。
 a,b,n:string;                     //定义a,b,c变量为字符串型。
 c:boolean;                        //定义c变量为布尔型。
 i:integer;                        //定义i变量为长整型。
begin                              //主程序开始。
 readln(n);                        //键盘输入字符串n。
 repeat                            //直到循环开始。
  c:=false;                        //定义c值为假。
  if length(n) mod 2 = 0 then      //判断n长度是否是偶数。
   begin                           //是偶数就进入程序。
    c:=true;                       //定义c为真。
    for i:=1 to length(n) div 2 do //计数循环,从1到n的长度整除2.
     if copy(n,i,1) <> copy(n,length(n)+1-i,1) then c:=false;//判断两遍是否吻合,否c为假。
    if c:(这里去:)=true then n:=copy(n,1,length(n) div 2);//如果c为真,n就去掉一半。 
   end;                            //子程序结束。
 until c=true;                     //直到c为真,推出循环。
 writeln(length(n));               //输出n的长度。
end.                               //程序结束。

7 楼

abbaabba 你的是4

8 楼

程序是错了,repeat循环推出条件应该改成c=false

9 楼

嘻嘻

我来回复

您尚未登录,请登录后再回复。点此登录或注册