鱼C论坛

 找回密码
 立即注册
查看: 93|回复: 1

c++问题

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

x
题目描述
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87:
STEP1: 87+78= 165
STEP2: 165+561= 726
STEP3: 726+627=1353
STEP4:1353+3531=4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<N<=10)进制数 M(低于100位).求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。
输入
给定一个N(2<N<=10或N=16)进制数M。
输出
最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。
样例输入
9 87
样例输出
6

我的代码:
#include<bits/stdc++.h>
using namespace std;

//定义N进制回文加法函数(2 <= N <= 10)
string func1(int N, string s1){
    int len, lc, i;
    string answer = "";
    string s2 = s1;
    reverse(s2.begin(), s2.end());
    int a[102] = {}, b[102] = {}, c[102] = {};
    len = s1.size();
    lc = len + 1;
    for (i=0; i<len; i++){
        a[i+1] = s1[i] - '0';
        b[i+1] = s2[i] - '0';
    }
    for (i=1; i<=lc; i++) c[i] = a[i] + b[i];
    for (i=lc; i>= 1; i--){
                c[i-1] += c[i] / N;
                c[i] = c[i] % N;
        }
        for (i=lc; i>= 1; i--){
            answer = char(c[i] + 48) + answer;
        }
        if (c[0] != 0) answer = '1' + answer;
}


//回文数判断函数
bool func2(string s1){
    string s2 = s1;
    reverse(s2.begin(), s2.end());
    if (s1 == s2) {
        return true;  //是回文数
    } else {
        return false;  //不是回文数
    }
}

//主程序
int main(){
    int N, i, count = 0;
    string s, he;
   
    cin >> N >> s;
    he = func1(N, s);
   
    while ((not func2(he)) && (count <= 30)) {
        he = func1(N, he);
        count++;
    }
   
    if (count > 30){
        cout << "Impossible";
    } else {
        cout << count;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
为了帮助您解决这个问题,我们需要编写一个C++程序来实现N进制数的回文数计算。以下是一个简化的代码示例,您可以参考:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

// 将数字字符串转换为指定进制的整数
long long toDecimal(const string &num, int base) {
    long long result = 0;
    for (char c : num) {
        result = result * base + (c - '0');
    }
    return result;
}

// 将整数转换为指定进制的字符串
string fromDecimal(long long num, int base) {
    string result;
    while (num > 0) {
        result += (num % base) + '0';
        num /= base;
    }
    reverse(result.begin(), result.end());
    return result;
}

// 检查字符串是否为回文
bool isPalindrome(const string &s) {
    return s == string(s.rbegin(), s.rend());
}

int main() {
    int N;
    string M;
    cin >> N >> M;

    int steps = 0;
    while (steps <= 30) {
        if (isPalindrome(M)) {
            cout << steps << endl;
            return 0;
        }
        string reversedM = string(M.rbegin(), M.rend());
        long long num1 = toDecimal(M, N);
        long long num2 = toDecimal(reversedM, N);
        long long sum = num1 + num2;
        M = fromDecimal(sum, N);
        steps++;
    }

    cout << "Impossible" << endl;
    return 0;
}

这个程序的基本思路是:

  • 将输入的N进制数转换为十进制进行计算。
  • 检查当前数是否为回文数。
  • 如果不是,将其与反转后的数相加。
  • 重复上述步骤,直到找到回文数或超过30步。


请根据您的具体需求进行调整和测试。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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