输入格式:输入的第一行给出输入字符串的数字(不含空格,最大长度为100) 并以小写形式)。然后是n行,每行包含一个字符串。
输出格式:N行输出,换行后面的每行都有YES或NO。 (如果字符串是魔方回文,则为YES,否则为NO)
示例输入: 4
satorarepotenetoperarotas
ABA
ABBA
abcabacba
示例输出:
是
否
是
NO
所以我写了下面的代码。但是在我的程序中,输出在输入后立即显示,一次只输入一个。
PS:如果您对如何提高代码效率有任何建议,请在答案中添加。谢谢
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{ int num_input,l;
scanf("%d",&num_input);
for(l=0;l<num_input;l++)
{
char str[100];
char i = 0;
int sq,j,k;
scanf("%s", str);
while(str[i]!='\0')
{
++i;
}
sq = sqrt(i);
if(i== sq*sq)
{
if(i%2==0)
{
for(j=0;j<=i/2;j++)
{
if((str[j]==str[i-j-1])&&(str[j+sq]==str[i-j-sq-1]))
{
if(j==i/2)
{
printf("YES\n");
}
}
else
{ if(j==i/2)
{
printf("NO\n");
}
}
}
}
if(i%2!=0)
{
for(k=0;k<=i/2;k++)
{
if((str[k]==str[i-k-1])&&(str[k+sq]==str[i-k-sq-1]))
{ if(k==i/2)
{
printf("YES\n");
}}
else
{if(j==i/2)
{
printf("NO\n");
}}
}
}
}
else
{
printf("NO\n");
}
}
return 0;
}
答案 0 :(得分:0)
“混合”输出和输入的问题是由于每次计算需要一个字符串这一事实引起的。如果你想扫描整个输入,然后显示输出,你应该......做到这一点。如果你知道将输入多少个字符串,那么如何做到这一点很简单:
使用int num_input; scanf("%d",&num_input);
扫描字符串数后,您可以创建一个大小为[num_input][max_str_length]
的二维字符数组。从您的代码中,我假设每个字符串的最大长度为100(给定char str[100];
)。
然后,在for
循环中,循环num_input
次,您应该扫描所有字符串并将它们放在2D数组中的适当位置。这样,您的输入就会被存储并准备好通过算法进行检查。我鼓励你,而不是在main
函数内编写简单的算法,创建一个函数,它将获取一个数组,它的大小作为参数,并在给定数组包含时返回true
或1
一个字符串,它是一个“魔术方形回文”或当它不是时返回false
/ 0
。如果你这样做,你可以再次循环num_input
次并在当前检查的数组上调用你的函数。每次fucntion返回true
时,输出“YES”,否则输出“NO”/
如果您对2D阵列和/或自己制作功能一无所知,我建议您购买一本好的C书,或者简单的谷歌一些教程,因为这些东西非常基本且相当容易理解。 / p>