2 条题解

  • 0
    @ 2025-2-10 16:51:36

    标准方法1:

    #include <bits/stdc++.h>
    using namespace std;
    
    // 函数:判断一个字符串是否是回文数
    bool isPal(const string& s) {
    	int len = s.length();
    	for (int i = 0; i < len / 2; ++i) {
    		if (s[i] != s[len - 1 - i]) {
    			return false; // 如果不是回文数,返回 false
    		}
    	}
    	return true; // 是回文数,返回 true
    }
    
    // 函数:计算N进制两个数相加
    string addBase(const string& num1, const string& num2, int base) {
    	int carry = 0;
    	int i = num1.length() - 1, j = num2.length() - 1;
    	string res;
    	
    	while (i >= 0 || j >= 0 || carry) {
    		int d1 = (i >= 0) ? (num1[i] - '0') : 0;
    		int d2 = (j >= 0) ? (num2[j] - '0') : 0;
    		int sum = d1 + d2 + carry;
    		
    		res.push_back(sum % base + '0');  // 当前位的结果
    		carry = sum / base;  // 更新进位
    		
    		--i;
    		--j;
    	}
    	
    	reverse(res.begin(), res.end()); // 结果需要反转
    	return res;
    }
    
    int main() {
    	int base;
    	string num;
    	cin >> base >> num;
    	
    	int steps = 0;
    	while (steps <= 30) {
    		if (isPal(num)) {
    			cout << steps << endl;  // 输出步骤数
    			return 0;
    		}
    		
    		string rev = num;
    		reverse(rev.begin(), rev.end());  // 获取逆序数
    		num = addBase(num, rev, base);  // 进行加法
    		++steps;
    	}
    	
    	cout << "Impossible" << endl;  // 超过30步仍未得到回文数
    	return 0;
    }
    
    
    • 0
      @ 2025-2-10 16:36:53
      #include <bits/stdc++.h>
      using namespace std;
      int n, steps = 0;
      vector<int> a, b;
      // 高精度加法函数:将a和b两个N进制数相加,并更新a
      void add(vector<int>& a, const vector<int>& b) {
      	int carry = 0; // 进位
      	// 遍历a数组,将a和b相加
      	for (int i = 0; i < a.size(); i++) {
      		if (i < b.size()) { // 如果b还有对应位
      			a[i] += b[i] + carry; // 加上进位
      		} else { // 如果b的位数小于a
      			a.push_back(b[i] + carry); // 把b的剩余位加到a
      		}
      		carry = a[i] / n; // 更新进位
      		a[i] %= n; // 当前位的结果
      	}
      	if (carry) a.push_back(carry); // 如果最后有进位,添加到末尾
      }
      // 判断一个数是否是回文数
      bool is_pal(const vector<int>& a) {
      	int i;
      	// 比较前后对应的数字
      	for (i = 0; i < a.size() / 2; i++) {
      		if (a[i] != a[a.size() - i - 1]) return false; // 如果不相等,返回false
      	}
      	return true; // 是回文数,返回true
      }
      // 将数字倒序存储
      void rev_num(const vector<int>& a) {
      	b = vector<int>(a.rbegin(), a.rend()); // 使用反向迭代器将a反转并存入b
      }
      // 输出N进制的数字
      void print(const vector<int>& a) {
      	for (int i = a.size() - 1; i >= 0; i--) {
      		if (a[i] < 10)
      			cout << a[i]; // 输出0-9
      		else
      			cout << char(a[i] - 10 + 'a'); // 输出a-f
      	}
      	cout << endl; // 换行
      }
      int main() {
      	string str;
      	cin >> n >> str; // 输入进制n和数字str	
      	// 处理输入,将数字转为N进制数组a
      	a.clear(); // 清空数组a
      	for (int i = str.size() - 1; i >= 0; i--) {
      		if (isdigit(str[i])) { // 如果是数字字符
      			a.push_back(str[i] - '0'); // 转换为数字并放入a
      		} else if (isalpha(str[i])) { // 如果是字母字符
      			a.push_back(tolower(str[i]) - 'a' + 10); // 转换为数字(a-f -> 10-15)
      		}
      	}	
      	// 循环,直到得到回文数或超过30步
      	while (!is_pal(a)) { // 如果不是回文数
      		rev_num(a); // 反转a
      		add(a, b); // a与反转后的b相加
      		steps++; // 步数增加
      		if (steps > 30) break; // 如果超过30步,退出循环
      	}	
      	// 判断是否超过30步
      	if (steps > 30) {
      		cout << "Impossible" << endl; // 如果超过30步,输出"Impossible"
      	} else {
      		cout << steps << endl; // 否则输出步骤数
      	}	
      	return 0; // 程序结束
      }
      
      
      • 1

      信息

      ID
      787
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      11
      已通过
      4
      上传者