目前主要分为三个专栏,后续还会添加:
专栏如下: 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
的最低位。
之前文章里面有提过
这里就不赘述了