回文C程序混淆
我正在探索如何使用字符串,我对这个特殊的程序有一些问题。有人能解释一下回文C程序混淆,c,string,palindrome,C,String,Palindrome,我正在探索如何使用字符串,我对这个特殊的程序有一些问题。有人能解释一下x
x
以及word[i-1-x]
的工作原理吗
为什么它必须是i/2
?为什么它必须是word[i-1-x]
#include <stdio.h>
int main()
{
char word[15];
int i, x;
printf("Enter a word\n");
scanf("%s", word);
for(i = 0; word[i] != '\0';)
i = i + 1;
for(x = 0; x< i/2; x++)
if(word[x] != word[i-1-x])
{printf("Your word is not a palindrome\n");}
else
{
printf("Your word is a palindrome\n");
}
}
#包括
int main()
{
字符字[15];
int i,x;
printf(“输入单词”);
scanf(“%s”,单词);
对于(i=0;单词[i]!='\0';)
i=i+1;
对于(x=0;x
您正在比较字符串的一半。因此,对于i/2
您正在查看字符串的前半部分,对于word[i-1-x]
您正在查看字符串另一半的“镜像”位置
为什么它必须是i/2
它不必是这样:i
也可以工作,但它不是最优的。如果您已经检查了从两端开始的所有字符对,并且字母一直到单词中间都是相同的,那么其余的检查也会成功
例如,考虑单词“alula”
。首先比较初始a
与最后一个a
,然后比较第二个位置的l
与后面第二个位置的l
,然后比较u
与自身。现在您已到达单词的中间位置,位于i/2
。如果继续,将比较相同的字符对,但会从不同的索引中选取它们。可以保证所有这些对都匹配,因此您可以通过完全跳过它们来节省一些CPU周期
为什么它必须是word[i-1-x]
#include <stdio.h>
int main()
{
char word[15];
int i, x;
printf("Enter a word\n");
scanf("%s", word);
for(i = 0; word[i] != '\0';)
i = i + 1;
for(x = 0; x< i/2; x++)
if(word[x] != word[i-1-x])
{printf("Your word is not a palindrome\n");}
else
{
printf("Your word is a palindrome\n");
}
}
因为数组是基于零的
i-1
是最后一个字符的索引,因此i-1-x
是从后面开始计数的x
-th索引。我假设您已将字符串存储在下面代码中名为string的变量中,这是函数的主要逻辑
注意:您还对for循环进行了legth/2次迭代,它将给出相同的结果
#include<stdio.h>
#include<string.h>
int main()
{
int i;
int flag=0;
for(i=0;i<strlen(string);i++)
{
if(string[i]==string[strlen(string)-i-1])
flag=1;
else
break;
}
if(flag==1)
printf("palindrome string");
else
printf("not palindrome string");
return 0;
}
#包括
#包括
int main()
{
int i;
int标志=0;
对于(i=0;i