Dual Palindromes<uscao>1.2 <进制转换+枚举>

the reason of failuire:1、题目是要求第一行输入N S 第一个数N为需要输出从S开始的符合条件的N个数,而我误解为S开始到S+N区间里的数.

2、开了一个名为qq的数组用来标记各个数字转换进制为为回文数的次数,但开得比较小,结果数据大于所开的数组了,应该看着题意来开数组.

thinking:把从S开始的数转换为2-10进制,然后判断其是否为回文数,然后统计其是回文数的次数,然后判断次数是否>=2,如果是则输出,然后用一个标记来记忆输出的次数以便循环的结束.

题目:

★Dual Palindromes 双重回文数
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321 就是一
个回文数,而 77778 就不是.当然,回文数的首和尾都应是非零的,因此 0220 就不是回文数.
事实上,有一些数(如 21),在十进制时不是回文数,但在其它进制(如二进制时为 10101)时就是
回文数.
11
编一个程序,从文件读入两个十进制数
N (1 <= N <= 15) S (0 < S < 10000)
然后找出前 N 个满足大于 S 且在两种以上进制(二进制至十进制)上是回文数的十进制数,输出到
文件上.
本问题的解决方案不需要使用大于 4 字节的整型变量.
PROGRAM NAME: dualpal
INPUT FORMAT
只有一行,用空格隔开的两个数 N 和 S.
SAMPLE INPUT (file dualpal.in)
3 25
OUTPUT FORMAT
N 行, 每行一个满足上述要求的数,并按从小到大的顺序输出.
SAMPLE OUTPUT (file dualpal.out)
26
27
28

源代码:

/*  
PROG: dualpal  
LANG: C++     
ID: me      
*/  
#include <bits/stdc++.h>
using namespace std;
int main(){
	freopen("dualpal.in","r",stdin);
	freopen("dualpal.out","w",stdout);
	long long a1,f1=0,a2,i,j,k,l,x,f2,a,f4=0;
	char result[500000];
	int qq[50000];
	memset(qq,0,sizeof(qq));
	cin >> a1 >> a2;
	int mod;
	for(i=a2+1;f4!=a1;i++){
		for(x=2;x<=10;x++){
			f1=0;
			f2=0;
			a=i;
			memset(result,0,sizeof(result));
	while(a){
		mod=a%x;
		a=a/x;
		if(mod<10)
		result[++f1]=mod+48;
		else
		result[++f1]=mod+55;
	}
	for(j=1;j<=f1/2;j++)
	if(result[j]!=result[f1-j+1])f2=1;
	if(f2==0)
	qq[i]++;
	}
	if(qq[i]>=2){
		f4++;
		qq[i]=-1;
		cout << i << endl;} 

}
return 0;
}


在 C++ 中,你可以创建一个名为 `isPalindrome` 的函数来检查给定的数字是否是回文,然后创建另一个函数 `findPalindromeSum` 来查找符合条件的所有回文数字。以下是相关的代码示例: ```cpp #include <iostream> #include <string> using namespace std; // 判断字符串是否为回文 bool isPalindrome(string num) { int start = 0; int end = num.length() - 1; while (start < end) { if (num[start] != num[end]) { return false; } start++; end--; } return true; } // 计算每个数位之和并寻找回文数字 vector<int> findPalindromeSum(int targetSum, int length) { vector<int> result; for (int i = 1; i <= 9; i++) { // 只考虑每一位都是单个数字的情况 for (int j = 1; j <= 9; j++) { // 构造长度为length的字符串,并计算数位之和 string palindrome = to_string(i); int sum = i + j; for (int k = 0; k < length - 2; k++) { palindrome += '0'; } palindrome += to_string(j); if (sum == targetSum && isPalindrome(palindrome)) { result.push_back(stoi(palindrome)); } } } return result; } int main() { int targetSum; cout << "请输入目标数位之和: "; cin >> targetSum; cout << "选择查找5位还是6位的回文数字: "; int length; cin >> length; vector<int> palindromes = findPalindromeSum(targetSum, length); if (!palindromes.empty()) { cout << "找到的回文数字: "; for (const auto &num : palindromes) { cout << num << " "; } } else { cout << "未找到满足条件的回文数字." << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值