PTA-回文数

判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。

输入格式:

直接输入一个5位数正整数。

输出格式:

输出“yes”或“no”。此处均为小写字母

输入样例:

12521

输出样例:

yes

输入样例:

65432

输出样例:

no

分析:

  1. 定义了一个能够存储5个字符的数组a
  2. 使用一个for循环,从0到4(总共5次),读取用户的输入并存储在数组a中。
  3. 判断输入的字符是否满足以下条件:第一个字符和第五个字符相同,第二个字符和第四个字符相同。
  4. 如果满足上述条件,则打印"yes",否则打印"no"。

C语言:

#include<stdio.h>
int main()
{
    int a[5];
    for(int i = 0; i<=4; i++)
    {
        a[i] = getchar();
        
    }
    if(a[0] == a[4] && a[1] == a[3])
    {
        printf("yes");
    }
    else 
    {
        printf("no");
    }
    return 0;
}

总结:

这个程序可以看作是一个非常简单的字符模式检测器。用户输入5个字符,然后程序检查这些字符是否满足特定的模式。这个模式是:第一个字符和最后一个字符相同,而中间的字符可以与其它任何字符相同或不同。

例如,如果用户输入的字符是abcde,那么程序将打印"yes",因为第一个字符a和最后一个字符e相同。但如果用户输入的字符是abbcde,那么程序将打印"no",因为第一个字符a和最后一个字符e不同。

PTA(Programming Teaching Assistant)最小回文数是一个常见的算法问题,其目标是通过给定的字符串,经过最少次数的插入操作,使得字符串变成一个回文字符串。回文字符串是指正读和反读都相同的字符串。 解决这个问题的基本思路是通过动态规划或贪心算法,遍历字符串的同时检查每个字符的位置,保证从左到右和从右到左的字符是匹配的。如果遇到不匹配的情况,就需要插入字符,使得整个字符串成为回文串。通常,我们可以选择在左边或者右边插入字符,但是为了保证插入次数最少,我们需要选择一个更合理的位置进行插入。 具体来说,可以使用以下步骤: 1. 初始化一个二维数组 `dp`,其中 `dp[i][j]` 表示字符串从第 `i` 个字符到第 `j` 个字符变为回文串需要的最小插入次数。 2. 对于长度为 `n` 的字符串,遍历所有可能的子串长度,即对每个 `l` 从 `2` 到 `n`,再对每个子串的起始位置 `i` 从 `0` 到 `n-l`,计算 `dp[i][i+l-1]`。 3. 对于子串 `str[i...j]`: - 如果 `str[i] == str[j]`,则 `dp[i][j] = dp[i+1][j-1]`,因为两端的字符已经匹配,不需要额外操作。 - 如果 `str[i] != str[j]`,需要插入一个字符来匹配两端,`dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1`,分别表示在左端或右端插入字符后,剩下的子串需要的最小插入次数加一。 4. 最终结果存储在 `dp[0][n-1]` 中,即整个字符串变为回文串需要的最小插入次数。 5. 通过回溯 `dp` 数组,可以找到具体的插入位置。 这里提供一个简化的代码示例,用于说明思路,并非完整的代码实现: ```c #include <stdio.h> #include <string.h> int minInsertions(char *str) { int n = strlen(str); int dp[n][n]; // 初始化动态规划数组 for (int i = 0; i < n; i++) { dp[i][i] = 0; // 单个字符的子串已经是回文串,不需要插入 } // 动态规划填表 for (int l = 2; l <= n; l++) { // 子串长度从2开始 for (int i = 0; i <= n - l; i++) { // 子串起始位置 int j = i + l - 1; // 子串结束位置 if (str[i] == str[j]) { dp[i][j] = dp[i + 1][j - 1]; } else { dp[i][j] = fmin(dp[i + 1][j], dp[i][j - 1]) + 1; } } } return dp[0][n - 1]; // 整个字符串变为回文串需要的最小插入次数 } int main() { char str[] = "abca"; printf("Minimum insertions to make string palindrome: %d\n", minInsertions(str)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值