一个正整数,正读和反读都相同的数为回文数。例如22,131,2442,37073,6,…所有1位数都是回文数。给出一个正整数n(1≤n≤10000),求出1,2,…,n之中(包括1和n)的回文数的个数。
时间: 2023-05-31 21:19:35 浏览: 226
cpp代码-(一维数组/动态存储)判断一个数是否为回文数,即正读反读都一样的数。
### 回答1:
一个正整数,正读和反读都相同的数为回文数。例如22,131,2442,37073,6,... 所有1位数都是回文数。给出一个正整数n(1≤n≤10000),求出1,2,…n之中(包括1和n),包括1和n的回文数的个数。
### 回答2:
题目要求我们统计1到n之间所有的回文数的个数。首先,我们需要明确什么是回文数。回文数是指正读和反读都相同的数,例如22、131、2442、37073等。
我们可以采用枚举的方法来统计回文数的个数。对于每一个数字i,我们将i转为字符串s,然后判断s是否为回文字符串。如果是,就将回文数的计数器加1。最后,所有1到n之间回文数的个数就是计数器的值。
现在的问题是,如何判断一个字符串是否是回文字符串。我们可以使用双指针来判断。具体地,我们令左指针指向字符串的左边界,右指针指向字符串的右边界。每次比较左右指针所指的字符是否相同,如果相同就将左指针向右移动一位,将右指针向左移动一位;如果不同,就说明这个字符串不是回文字符串。
以下是代码实现:
```
#include<iostream>
#include<string>
using namespace std;
bool isPalindrome(string s) {
int left = 0, right = s.size() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}
int countPalindrome(int n) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (isPalindrome(to_string(i))) {
cnt++;
}
}
return cnt;
}
int main() {
int n;
cin >> n;
int ans = countPalindrome(n);
cout << ans << endl;
return 0;
}
```
时间复杂度分析:对于每一个数字,判断其是否为回文数的时间复杂度是O(m),其中m是数字的位数。因此,总时间复杂度是O(nm)。对于本题,输入的数字最大为10000,因此时间复杂度是可以接受的。
### 回答3:
首先,对于一位数,它本身就是回文数,所以1-9之间有9个回文数。对于两位数,我们可以枚举它们的十位和个位,只要十位和个位相等,就是回文数,所以共有9个回文数。同理,对于三位数,百位和个位相等即可,共有90个回文数。对于四位数,我们可以分类讨论,如果它的百位和个位相等,并且十位和千位相等,则是回文数,共有9 * 10 = 90个。如果它的百位和个位不相等,那么它的回文数一定是五位数以上,因此不考虑。同理,对于五位数及以上的数,一定不是回文数。所以,1-n之间的回文数个数就是9 + 9 + 90 + 90 = 198(其中1位数9个,2位数9个,3位数90个,4位数90个)。因此,我们可以通过简单的枚举得到1-n之间的回文数个数。
阅读全文