鱼C论坛

 找回密码
 立即注册
查看: 1625|回复: 5

[已解决]求助,根据题目要求我写的代码有错误吗?

[复制链接]
发表于 2019-1-28 11:31:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 NYJYA 于 2019-1-28 11:47 编辑

题目描述:
小鹏有一面镜子,可以把接触的东西变成原来的两倍。但是因为是镜子嘛,只能对称变换。假如有一个为BA的珍珠项链,字母不一样代表的颜色不一样。现在小鹏用镜子将项链复制之后,项链变成了BAAB。如果再复制一遍的话,项链就会变成BAABBAAB。因为小鹏比较贪心,一直复制,最后竟然忘记原来的项链是什么样的了,接下来就请聪明的acmer编写程序,算出最开始项链的长度吧。

输入:
第一行N表示接下来有N(N<=10)个串;之后的N行,每行是一个不超过100个大写英文字母组成的串。

输出:
输出N行,每行是项链的初始长度
我写了两种代码,但都通不过,先谢谢大家了。
第一种:没有判断是不是大写字母的
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         int N,i,j,num,b[100],k=0;
  6.         char a[11][101];
  7.         scanf("%d",&N);
  8.         getchar();
  9.         for(i=0;i<N;i++)
  10.         {
  11.                 gets(a[i]);
  12.         }
  13.         for(i=0;i<N;i++)
  14.         {
  15.                         num=1;
  16.                 for(j=1;j<strlen(a[i])/2;j++)
  17.                 {
  18.                
  19.                         if(a[i][k]!=a[i][j] && a[i][j]!=a[i][j-1]) num=num+1;
  20.                 }
  21.                 b[i]=num;
  22.         }
  23.         for(i=0;i<N;i++)
  24.         {
  25.                 printf("%d\n",b[i]);
  26.         }
  27.         return 0;
  28. }
复制代码

第二种:有判断是大写字母的
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         int N,n,m,i,j,num,b[100],k=0,c,d=0;
  6.         char a[11][101];
  7.         scanf("%d",&N);
  8.         getchar();
  9.         for(i=0;i<N;i++)
  10.         {
  11.                 gets(a[i]);
  12.         }
  13.         for(i=0;i<N;i++)
  14.         {
  15.                 for(j=0;j<strlen(a[i]);j++)
  16.                 {
  17.                         if(a[i][j]>='A' && a[i][j]<='Z')
  18.                         c=1;
  19.                         else
  20.                         {
  21.                                 c=0;
  22.                                 break;       
  23.                         }
  24.                 }       
  25.                 if(c==0) continue;
  26.                 else
  27.                 {
  28.                         num=1;
  29.                         for(m=1;m<strlen(a[i])/2;m++)
  30.                 {
  31.                
  32.                         if(a[i][k]!=a[i][m] && a[i][m]!=a[i][m-1]) num=num+1;
  33.                 }
  34.                         b[d]=num;d=d+1;
  35.         }
  36.        
  37.         }
  38.         for(n=0;n<d;n++)
  39.                 {
  40.                         printf("%d\n",b[n]);
  41.                 }
  42.         return 0;
  43. }
复制代码

最佳答案
2019-1-28 16:51:24
  1. int OriginStringLength(char* sz)   //获取原始字符的长度
  2. {
  3.     int length,i;
  4.     for (length=0;sz[length]!='\0';++length);     //字符串总是以'\0'结尾
  5.         
  6.     if (length==0) return 0;                                        //如果长度为0,原始字符串也只可能是0长度
  7.     while ((length & 1)==0)                                                //如果长度为奇数,则说明不需要继续分解
  8.     {
  9.         for (i=0;i<length/2;++i)                                                //查看字符串是否回文 ,
  10.             if (sz[i]!=sz[length-1-i]) goto EndWhile;   //不是回文则跳出
  11.         length=length>>1;                                                                //否则取前半,继续循环,直到字符串不是回文为止
  12.     }
  13.         
  14.     EndWhile:
  15.     return length;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-28 14:01:27 | 显示全部楼层
  1.         for(m=1;m<strlen(a[i])/2;m++)
  2.                 {
  3.                
  4.                         if(a[i][k]!=a[i][m] && a[i][m]!=a[i][m-1]) num=num+1;
  5.                 }
复制代码

我没看懂这一段思路是什么,k只有在声明的时候=0,能讲一讲么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-28 14:16:53 | 显示全部楼层
本帖最后由 Croper 于 2019-1-28 14:26 编辑

  1. #include <stdio.h>

  2. int OriginStringLength(char* sz)
  3. {
  4.     int length,i;
  5.     for (length=0;sz[length]!='\0';++length);
  6.         
  7.     if (length==0) return 0;
  8.     while ((length & 1)==0)
  9.     {
  10.         for (i=0;i<length/2;++i)
  11.             if (sz[i]!=sz[length-1-i]) goto EndWhile;
  12.         length=length>>1;
  13.     }
  14.         
  15.     EndWhile:
  16.     return length;
  17. }

  18. int main()
  19. {
  20.     int N,i;
  21.     int ans[10];
  22.     char sz[100];
  23.     scanf("%d",&N);
  24.     getchar();
  25.     for (i=0;i<N;++i)
  26.     {
  27.         gets(sz);
  28.         ans[i]=OriginStringLength(sz);
  29.     }
  30.     for (i=0;i<N;++i)
  31.         printf("%d\n",ans[i]);
  32.         
  33.     return 0;
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-28 15:27:05 | 显示全部楼层


可不可以讲讲你的思路?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-28 16:51:24 | 显示全部楼层    本楼为最佳答案   
  1. int OriginStringLength(char* sz)   //获取原始字符的长度
  2. {
  3.     int length,i;
  4.     for (length=0;sz[length]!='\0';++length);     //字符串总是以'\0'结尾
  5.         
  6.     if (length==0) return 0;                                        //如果长度为0,原始字符串也只可能是0长度
  7.     while ((length & 1)==0)                                                //如果长度为奇数,则说明不需要继续分解
  8.     {
  9.         for (i=0;i<length/2;++i)                                                //查看字符串是否回文 ,
  10.             if (sz[i]!=sz[length-1-i]) goto EndWhile;   //不是回文则跳出
  11.         length=length>>1;                                                                //否则取前半,继续循环,直到字符串不是回文为止
  12.     }
  13.         
  14.     EndWhile:
  15.     return length;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-28 22:36:21 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-15 22:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表