目前主要分为三个专栏,后续还会添加:
专栏如下: C语言刷题解析 C语言系列文章 我的成长经历
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
今天牛牛学到了回文串,他想在数字里面找回文,即回文数,回文数是正着读与倒着读都一样的数,比如1221,343是回文数,433不是回文数。请输出不超过n的回文数。
输入描述:
输入一个整数n(1 <= n <= 100000)
输出描述:
从1开始按从小到大的顺序输出所有回文数
示例1
思路 :
可以使用用数组存放数据的操作
将1-100000中所有的数字都遍历出来
然后判断数组的下标 是否相等
------------------------------------------------
操作起来有点复杂 还是用取模和取余运算吧
其中要注意的是 9999 99999 这种大的数字 9889 98889 这种也算是回文数
问题定义:
输入:一个整数 𝑛n,范围是 1≤𝑛≤1000001≤n≤100000。
输出:所有不超过 𝑛n 的回文数,按从小到大的顺序输出。
算法设计:
遍历:从 1 开始遍历到 n,检查每个数是否为回文数。
回文数检查:对于每个数 x,我们可以通过以下步骤检查它是否是回文数:
转换为字符串:将整数 x 转换为字符串。
反转字符串:反转字符串。
比较:比较原始字符串和反转后的字符串是否相同。
优化:实际上,我们不需要将整个字符串反转,只需要反转一半,然后比较前半部分和后半部分是否相同。
数据结构选择:
使用一个整数变量来存储当前遍历的数。
使用一个字符串来存储整数的字符表示形式。
算法实现:
初始化:设置一个整数变量 i
从 1 开始。
循环:使用 for
循环遍历从 1 到 n 的所有整数。
转换为字符串:将当前整数 i
转换为字符串。
反转字符串:编写一个函数来反转字符串的一半。
比较:比较原始字符串和反转后的字符串。
输出:如果相等,说明是回文数,输出该数。
代码 1 :
/* 思路 : 可以使用用数组存放数据的操作
将1-100000中所有的数字都遍历出来
然后判断数组的下标 是否相等
------------------------------------------------
操作起来有点复杂 还是用取模和取余运算吧
*/
// # include <stdio.h>
// int main ()
// {
// int a,b,c,d,e,f;
// return 0;
// }
# include <stdio.h>
int main ()
{
int n = 0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
if (i<10)
{
printf("%d\n",i);
}
else if (i<100)
{
if (i%10==i/10)
{
printf("%d\n",i);
}
}
else if (i<1000)
{
if (i%10==i/100)
{
printf("%d\n",i);
}
}
else if (i<10000)
{
if (i%10==i/1000&&i/100%10==i/10%10) //9999 9889 包括这样
{
printf("%d\n",i);
}
}
else if (i<100000)
{
if (i%10==i/10000&&i/1000%10==i/10%10) //99999 98889
{
printf("%d\n",i);
}
}
}
return 0;
}
代码 2 :
使用数组的方法来写
int main ()
{
int n,i,a,b[10],c=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
a=i;\\把数保存到一个变量中
for(int k=0;;k++)
{
b[k]=a%10;\\将每一位数保存到数组中
a=a/10;
c=c*10+b[k];
if(a==0)
break;
}
if(c==i)
printf("%d\n",i);
}
return 0;
}
代码 3 :
相对复杂
#include <stdio.h>
#include <string.h>
char *my_itoa(int value, char *str, int radix)
{
static char dig[] =
"0123456789"
"abcdefghijklmnopqrstuvwxyz";
int n = 0, neg = 0;
unsigned int v;
char *p, *q;
char c;
/* 负数:十进制直接在前面加负号,其它进制用补码 */
if (radix == 10 && value < 0)
{
v = -value;
neg = 1;
}
else
{
v = value;
}
/* 其它进制的负数转为unsigned int类型,即取了补码 */
do
{
str[n++] = dig[v % radix];
v /= radix;
} while (v);
if (neg)
str[n++] = '-';
str[n] = '\0';
/* 字符串反转 */
for (p = str, q = p + (n - 1); p < q; ++p, --q)
c = *p, *p = *q, *q = c;
return str;
}
void fun(long n)
{
char num[7];
int i, j;
my_itoa(n, num, 10); //将整形n,以十进制存入num中;
for (i = 0, j = strlen(num) - 1; i <= j; i++, j--)
{
if (num[i] != num[j])
break;
}
if (i >= j)
{
printf("%d ", n);
}
}
int main()
{
long n = 0;
long i = 0;
scanf("%ld", &n); // 12321;
for (i = 1; i <= n; i++)
fun(i);
return 0;
}
扩展:取模与取余
m % 10
:取模运算,用于获取数字m
的最低位。
m /= 10
:整数除法运算,用于去掉数字m
的最低位。
之前文章里面有提过
这里就不赘述了