我需要帮助在 c 中编写代码。我需要在给定的序列中找到一个 int 的给定长度的回文。像这样:长度为 3 和序列为 3846401 这里是 464 或:长度 4 和序列:34000003 这里是 0000
我真的需要一些建议,我已经尝试了几个小时,无法做到这一点。
编辑后:是的,我理解所有的 downvotes,我一般寻找一些建议。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int s;
int k;
int module;
int last;
int y;
int t=1;
int counter=0;
#define N 10
int main() {
printf("Please enter a length:\n");
scanf("%d",&s);
printf("Please enter a sequence:\n");
scanf("%d",&k);
int x =k;
while(x>0) {
x = x/10;
y++;
}
int sequence[N];
int last_array[N];
for(int i=0; i<1;i++){
last_array[i]=-1;
}
for(int i=0; i < y; i++){
module= k%10;
sequence[i] = module;
k=k/10;
}
for(int i=0; i < y; i++){
if( counter<s&&sequence[i]==sequence[i+s-t]){
last_array[counter]=sequence[i];
t=2+t;
counter++;
}
}
if(last_array[0]==-1){
printf("There is no such palindrome.\n");
}
else{
printf("The requested palindrome is: ");
for(int i=0; i<s; i++){
printf("%d",last_array[i]);
}
}
return 0;
}
我得到了 downvoters 的观点,但似乎你很失落。因为你没有发布你的任何代码,我也不会发布任何代码,直到你这样做。我只会尝试解释你将如何处理任务。
一般来说,有一些方法可以确定数组的子集是否是回文。在我看来,最容易理解的一个如下。
假设你有一个这样的数组:[3,8,4,6,4,0,1]
如果要查找长度为 3 的回文,则可以将输入数组划分为长度为 3 的较小的子数组。在上面的示例中,您将有 5 个可能的子数组,其长度为所需回文的长度:
[3,8,4]
[8,4,6]
[4,6,4]
[6,4,0]
[4,0,1]
如您所见,第 3 个是此示例的有效回文。现在如何确定何时存在有效回文?基本上,您遍历所有可能的子数组,将当前子数组分成两半,并检查左半部分的所有数字是否与右侧的数字相同。如果左侧的一个数字不等于右侧的相应数字,则您知道它不可能是回文。如果,对于每个数字,
为了帮助您可视化,我们将开始定义为“s”,结束定义为“e”:
这是一个奇数阵列,在这种情况下,第三个子阵列的例子。
第一次迭代:
s e
| |
v v
[4,6,4] start=4, end=4 <- They are both the same
第 2 次迭代(如果不均匀,则开始和结束落在同一数字上):
s/e
|
v
[4,6,4] start=6, end=6 <- equal again
对于一个甚至任意数组,它看起来像这样:
第一次迭代:
s e
| |
v v
[4,6,1,1,6,4] start=4, end=4 <- equal
第二次迭代:
s e
| |
v v
[4,6,1,1,6,4] start=6, end=6 <- equal
第三次迭代:
s e
| |
v v
[4,6,1,1,6,4] start=1, end=1 <- equal and finish
如果在某些时候它们不相等,再次,你知道它不可能是回文。
编程你会有两个循环。外循环遍历所有可能的子数组,第二个循环比较元素。如果第二个循环在某个时候确定 s 和 e 不一样,你知道它不是回文,可以继续下一个子数组。
我希望现在更清楚一点,如果你能澄清你实际上被困在哪里会更容易,因为没有人能知道你有什么样的编程经验。
u 可以通过以下代码在 python中检查集合中是否有回文子集:
nums = list(map(int, input().split()))
flag = False
for j in range(len(nums)):
for k in range(j + 2, len(nums)):
if nums[j] == nums[k]:
flag = True
break
if flag == True:
print("YES")
else:
print("NO")
解释:如果列表中的第一个和最后一个项目是相同的,那么它将是一个回文。
例如:如果我们有一个这样的列表 [1,2,2,1]
j =0
k = 0 + 2,跳过它们之间的第二个数字
如果 nums [j] = = nums [k]列表中的第一个和最后一个项目,那么它将是回文。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(61条)