鱼C论坛

 找回密码
 立即注册
查看: 1988|回复: 14

偶位回文递归解决

[复制链接]
发表于 2021-11-14 12:31:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冰清玉洁丸 于 2021-11-14 12:42 编辑

我们将这样的数字定义为偶位回文数:

1.该数字的位数是偶数
2.该数字是一个回文数
例如:1221 就是一个偶位回文数,而 121 和 1234 都不是偶位回文数,前者不满足数字的位数是偶数,后者不满足回文数。

给定一个正整数 n,请你求出从小到大前 n 个偶位回文数的和是多少?

输入共一行,一个正整数 n
输出前 n 个偶位回文数的和。

我的代码:
#include <iostream>
#include <stack>
#include <cmath>
using namespace std;

stack<int> every;
int init(int n)
{
        int m = n;
        
        for (int i = 0; n != 0; i++)
        {
                every.push(n % 10);
                n /= 10;
        }
        int length = every.size();
        int a[length * 2];
        for (int i = 0; !every.empty(); i++)
        {
                a[i] = every.top();
                every.pop();
        }
        for (int i = length, j = 1; i < length * 2; i++, j += 2)
        {
                a[i] = a[i - j];
        }
        int sum = 0;
        for (int i = 0, j; i < length; i++)
        {
                j = pow(10, length - 1 - i);
                sum += a[i] * j;
        }
        
        if (m == 0)
        {
                return sum;
        }
        else
        {
                return (sum + init(--m));
        }
}

int main()
{
        int n;
        cin>>n;
        
        cout<<init(n);
        
        return 0;
}

目测无错误,递交后5WA,1RE
求挑错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-14 13:20:28 | 显示全部楼层
#include <iostream>
#include <string.h>

// 判断字符串是否回文
bool isPalindrome(char str[]){
        int i = 0;
        int n = strlen(str) - 1;
        while (n > i){if (str[i++] != str[n--]) return false;}
        return true;
}

// 判断字符串长度是否偶数
bool isEven(char str[]){return !(strlen(str)%2);}

int main()
{
    int sum = 0, n;
    std::cin >> n;
    for(int i = 0; i < n; i++){
        std::string a = std::to_string(i); // 将整数转换成字符串
        char b[a.length() + 1]; // 定义字符数组
        strcpy(b, a.c_str()); // 将字符串储存进字符数组里
        if(isEven(b) && isPalindrome(b)){ // 开始判断条件
            sum += i;
        }
    }
    std::cout << sum << std::endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 13:27:27 | 显示全部楼层
5WA,1RE 表示 5 题错,1 题执行时错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 17:23:48 | 显示全部楼层

不对,你这样直接所有测试点全错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 17:49:06 | 显示全部楼层
冰清玉洁丸 发表于 2021-11-14 17:23
不对,你这样直接所有测试点全错

抱歉,我误会你的题目,代码已经修改:
#include <iostream>
#include <string.h>

// 判断字符串是否回文
bool isPalindrome(char str[]){
        int i = 0;
        int n = strlen(str) - 1;
        while (n > i){if (str[i++] != str[n--]) return false;}
        return true;
}

// 判断字符串长度是否偶数
bool isEven(char str[]){return !(strlen(str)%2);}

int main()
{
    long long sum = 0;
    int n;
    std::cin >> n;
    for(int i = 0; n; i++){
        std::string a = std::to_string(i); // 将整数转换成字符串
        char b[a.length() + 1]; // 定义字符数组
        strcpy(b, a.c_str()); // 将字符串储存进字符数组里
        if(isEven(b) && isPalindrome(b)){ // 开始判断条件
            sum += i;
            n--;
        }
    }
    std::cout << sum << std::endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 17:57:56 | 显示全部楼层
傻眼貓咪 发表于 2021-11-14 17:49
抱歉,我误会你的题目,代码已经修改:

两个正确,三个超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 18:01:28 | 显示全部楼层
冰清玉洁丸 发表于 2021-11-14 17:57
两个正确,三个超时

请问题目范例参数边界多少?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 18:02:58 | 显示全部楼层
最大参数极限是多少?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 18:03:37 | 显示全部楼层
1≤n≤10^5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 18:04:11 | 显示全部楼层
傻眼貓咪 发表于 2021-11-14 18:02
最大参数极限是多少?

1≤n≤10^5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 18:07:11 | 显示全部楼层
太大了,我用的是数组列表肯定超时,建议用 vector 向量数组(哈希 hash)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 18:07:50 | 显示全部楼层
傻眼貓咪 发表于 2021-11-14 18:07
太大了,我用的是数组列表肯定超时,建议用 vector 向量数组(哈希 hash)

好的自己试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 18:26:40 | 显示全部楼层
#include <iostream>
#include <string.h>
#include <vector>

// 判断字符串是否回文
bool isPalindrome(std::vector<char> &str){
        int i = 0;
        int n = str.size() - 1;
        while (n > i){if (str[i++] != str[n--]) return false;}
        return true;
}

// 判断字符串长度是否偶数
bool isEven(std::vector<char> &str){return !(str.size()%2);}

int main()
{
    long long sum = 0;
    int n;
    std::cin >> n;
    for(int i = 0; n; i++){
        std::string a = std::to_string(i); // 将整数转换成字符串
        std::vector<char> b(a.begin(), a.end());
        if(isEven(b) && isPalindrome(b)){ // 开始判断条件
            sum += i;
            n--;
        }
    }
    std::cout << sum << std::endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 18:41:51 | 显示全部楼层

感谢,但还是有3个超时,我自己写吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 18:59:04 | 显示全部楼层
哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 23:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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