首页 > 试题广场 >

回文对称数

[编程题]回文对称数
  • 热度指数:14427 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
今天牛牛学到了回文串,他想在数字里面找回文,即回文数,回文数是正着读与倒着读都一样的数,比如1221,343是回文数,433不是回文数。请输出不超过n的回文数。

输入描述:
输入一个整数n(1 <= n <= 100000)


输出描述:
从1开始按从小到大的顺序输出所有回文数
示例1

输入

10

输出

1
2
3
4
5
6
7
8
9
#include<math.h>

int jiweishu(int x)
{
    if (x > 9)
        return 1 + jiweishu(x / 10);
    else
        return 1;
}


void panduan(int x, int m)
{
    if (m % 2 == 0)
    {
        int n = 0;
        for (n = 1; n <= (m / 2); ++n)
        {
            int a = pow(10, m - n), b = (int)(pow(10, n));
            if (b > 10)
            {
                if (((x / a) % 10) != ((x % b) / 10))
                    break;
            }
            else
            {
                if (((x / a) % 10) != (x % b))
                    break;
            }
        }
        if (n == ((m / 2) + 1))
            printf("%d\n", x);
    }
    else
    {
        int n = 0;
        for (n = 1; n <= ((m - 1) / 2); ++n)
        {
            int a = pow(10, m - n), b = (int)(pow(10, n));
            if (b > 10)
            {
                if (((x / a) % 10) != ((x % b) / 10))
                    break;
            }
            else
            {
                if (((x / a) % 10) != (x % b))
                    break;
            }
        }
        if (n == (((m - 1) / 2) + 1))
            printf("%d\n", x);

    }

}




int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    for (i = 1; i <= n; ++i)
    {
        int m = jiweishu(i);//确定n是几位数
        if (m < 2)
            printf("%d\n", i);
        else
            panduan(i, m);

    }



    return 0;
}

发表于 2024-08-11 13:38:04 回复(0)
#include <stdio.h>
int symmetry_num(int a)
{
    int num = 0;
    while(a)
    {
        num = a % 10 + num * 10;
        a = a / 10;
    }
    return num;
}

int main() {
    int n = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        if (i==symmetry_num(i))
        {
            printf("%d\n", i);
        }
    }
    return 0;
}

发表于 2024-08-05 19:23:14 回复(0)
#include <stdio.h>

int main() {
    int a[30];
    int n = 0;
   
    scanf("%d", &n);

    //回文数相当于换位置,后面的数一直*10,得到得结果与原来的一样
    for (int i = 1; i<=n; i++) {
        //i的值还要和sum比较
        int tmp = i;
        //sum的值每次也需要变成0,不然初值就不为0
        int sum = 0;
        while (tmp) {
            sum  = sum*10+ tmp % 10;
            tmp /= 10;
        }
        if(sum == i)
            printf("%d\n",sum);
    }
    return 0;
}

发表于 2024-06-19 02:34:46 回复(0)
#include <stdio.h>

int main()
{
    int n;
    int arr[6] = { 0 };

    scanf("%d", &n);
    //1.遍历1-100000之间所有的数字
    //2.判断这个数字是否是回文数
    //3.这个数字是回文数,输出 换行

    for (int i = 1; i <= n; i++)
    {
        int amont = 0;
        if (i / 10 == 0)
        {
            printf("%d\n", i);
        }
        else
        {
            int m = i;
            int k = i;
            while (m) //判断这个数字是几位数
            {

                amont++;
                m = m / 10;
            }
            for (int j = amont - 1; j >= 0; j--) //将这个数字的每一位存入数组
            {

                arr[j] = k % 10;
                k /= 10;
            }
            int left = 0;
            int right = amont - 1;
            while (left < right) //判断数组中的左右对称的两个数字是否相等
            {
                if (arr[left] == arr[right])
                {
                    left++;
                    right--;
                }
                else
                {
                    break;
                }
            }
            if (left >= right)
            {
                printf("%d\n", i);
            }
        }
    }
    return 0;
}
发表于 2024-06-10 17:28:07 回复(0)
/*      思路 : 可以使用用数组存放数据的操作
                将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;
}

发表于 2024-05-26 13:20:40 回复(0)
#include <stdio.h>
#include <math.h>

int main()
{
    int n = 0;
    scanf("%d", &n);

    int a = 0, b = 0, j = 0, c = 0, ret = 0, i;  //a原值, b位数上的数, c 倒数
    for (a = 1; a <= n; a++)
    {
        ret = a;
        i = a;

        while (i > 0)  //计算10的i次幂
        {
            b = i % 10;
            j++;
            i = i / 10;
        }

        c = 0;
        while (ret > 0)
        {
            b = ret % 10;
            c += b * (int)pow(10, j - 1);
            ret = ret / 10;
            j--;
        }


        if (c == a)
            printf("%d\n", c);

    }
    
    return 0;
}
发表于 2024-05-05 14:42:09 回复(0)
#include <stdio.h>

int main() {
    int n, length, count;
    char s[6] = { ' ', ' ', ' ', ' ', ' ', ' ', };
    while (scanf("%d", &n) != EOF) {
        for (int i = 1; i <= n; i++) {
            sprintf(s, "%d", i);
            length = strlen(s);
            count = length / 2;
            if (count == 0) {
                printf("%d\n", i);
            }
            for (int j = 0; j < count; j++) {
                if (s[j] != s[length - j - 1]) {
                    break;
                }
                if (j == count-1) {
                    printf("%d\n", i);
                }
            }
        }
    }
    return 0;
}
编辑于 2024-03-07 21:30:04 回复(1)
#include <stdio.h>

int main()
{
    int n = 0;//输入的整数
    int m = 0;//每次判断的数
    int j = 0;//倒着读判断的数
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
    {
        m = i;
        while (m)//计算倒着读
        {
            j *= 10;
            j += m % 10;
            m = m / 10;
        }

        if (i == j)//判断并输出
            printf("%d\n", j);

        j = 0;//初始化数据
    }
    return 0;
}

编辑于 2024-02-18 14:00:32 回复(1)
#include <stdio.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    int k = 0;
    int arr[6] = { 0 };
    int i = 0;
    if (n < 10)
    {
        for (i = 1; i <= n; i++)
        {
            printf("%d\n", i);
        }
    }
    else {
        for (i = 1; i < 10; i++)
        {
            printf("%d\n", i);
        }
        for (i = 10; i <= n; i++)
        {
            int a = 0;
            int b = i;
            int j = 0;
            while (b > 0)
            {
                arr[j] = b % 10;
                b /= 10;
                j++;
            }
            for (k = 0;; k++)
            {
                j--;
                if (arr[k] == arr[j])
                {
                    if (k == j - 1 || k == j)
                    {
                        a = 1;
                        break;
                    }
                    continue;
                }
                else {
                    a = 0;
                    break;
                }
            }
            if (a == 1)
            {
                printf("%d\n", i);
            }
        }
    }

    return 0;
}
编辑于 2024-02-15 22:52:44 回复(0)
#include <stdio.h>
#include <math.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        int a[6]={0};
        for(int x=0; x<=5; x++){
            a[x] = ((int)(i / pow(10,x)) % 10);
        }
        if(i<10){
            printf("%d\n", i);
        }else if(i<100){
            if(a[0] == a[1]){
                printf("%d\n", i);
            }
        }else if(i<1000){
            if(a[0] == a[2]){
                printf("%d\n", i);
            }
        }else if(i<10000){
            if(a[0] == a[3] && a[1] == a[2]){
                printf("%d\n", i);
            }
        }else{
            if(a[0] == a[4] && a[1] == a[3]){
                printf("%d\n", i);
            }
        }
    }
    return 0;
}
发表于 2024-01-23 17:42:41 回复(0)
#include <stdio.h>

int main() {
    int a;//a作为数据的输入
    int b = 0, c = 0, n = 0;
    int arr[6] = { 0 };
    scanf("%d", &a);
    for (int i = 1; i <= a; i++) {
        n = 0;
        c = i;
        do {
            b = c% 10;//b=c%10
            c = c / 10;
            arr[n] = b;
            n++;
        } while
            (c != 0);
        n--;
        int left = 0;
        int right = n;
        while (arr[left] == arr[right]) {//这里用数组确实麻烦了
            left++, right--;
        }
        if (left>right) {//r<l
            printf("%d\n", i);
        }
    }
    return 0;
}
发表于 2024-01-15 17:21:46 回复(0)
#include<stdio.h>
#include<string.h>

//pleft       pright
int main()
{
    int n=0;
    scanf("%d",&n);
    char ch[11]={0};
    for(int i=1;i<=n;i++)
    {
        sprintf(ch,"%d",i);
        char*pright=ch;
        char*pleft=ch;
        while('\0'!=*pright){pright++;}
        pright--;
        while(pleft<pright)
        {
            if(*pleft!=*pright)
                break;
            pleft++;
            pright--;
        }
        if(pleft>=pright)
        printf("%d\n",i);
    }
    return 0;
}
发表于 2023-10-27 16:46:30 回复(1)
#include <stdio.h>
#include <math.h>
int main() {
    void find(int);
    int n;
    scanf("%d",&n);
    find(n);
    return 0;
}

void find(int n){
    int pr(int ,int);
   
    for(int i=1;i<n+1;i++){
        int k=1;
            int m=i;
        for(int j=0;j<i;j++){
            if(m/10){k++;m/=10;}
            else break;
        }
        if(2==pr(i,k))printf("%d\n",i);
    }
}

int pr(int i,int k){
    if(k==1)return 2;
    if(i/(int)pow(10,k-1)==i%10&&k>=2){
       if(k>2) {if(pr((i/10)%((int)pow(10,k-2)),k-2)==2)return 2;else return 0;}
       else return 2;
    }
    else return 1;
}
发表于 2023-10-03 14:46:13 回复(0)
#include <stdio.h>
#include <math.h>

void test(int arr1[], int i, int* px)
{
    arr1[*px] = i % 10;
    (*px)++;
    if (i / 10 != 0)
    {
        test(arr1, i / 10, px);
    }
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr1[6] = { 0 };
    int arr2[6] = { 0 };
    if (n >= 1 && n <= 100000)
    {
        int i = 0;
        for (i = 1; i < 10; i++)
        {
            if (i / 10 == 0 && i % 10 != 0)
            {
                printf("%d ", i);
            }
        }
        for (i = 10; i < n; i++)
        {
            int j = 0;
            int count = 0;
            test(arr1, i, &count);
            int k = 5;
            while (k)
            {
                if (i / ((int)pow(10, k)) != 0)
                {
                    arr2[0] = i / ((int)pow(10, k));
                    for (j = 1; j <= count - 2; j++)
                    {
                        if (k > 1)
                        {
                            arr2[j] = (i % ((int)pow(10, k))) / ((int)pow(10, k - 1));
                            k--;
                        }
                    }
                    arr2[count - 1] = i % 10;
                    break;
                }
                k--;
            }
            int count1 = 0;
            for (j = 0; j < count; j++)
            {
                if (arr1[j] == arr2[j])
                {
                    count1++;
                }
            }
            if (count1 == count)
            {
                printf("%d ", i);
            }
        }
    }
    return 0;
}

发表于 2023-08-31 22:59:21 回复(0)
#include <stdio.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int j = 0;
    int k = 0;
    int count = 0;
    for(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 / 100 == i % 10)
                printf("%d\n", i);
        }
        else if(i < 10000)
        {
            if(i / 1000 == i % 10 && i / 100 % 10 == i / 10 % 10)
                printf("%d\n", i);
        }
        else if(i < 100000)
        {
            if(i / 10000 == i % 10 && i / 1000 % 10 == i / 10 % 10)
                printf("%d\n", i);
        }
    }

    return 0;
}
发表于 2023-04-08 16:10:33 回复(0)
#include <stdio.h>

int test(int x)
{
  int i=x;
  int k=0;
  while(i)
  {
    k=k*10+i%10;
    i/=10;
  }
  if(k==x)
  {
    return 1;
  }
  else {
  return 0;
  }
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int ret=test(i);
        if(ret)
        {
            printf("%d\n",i);
        }
    }
    return 0;
}
发表于 2023-04-04 13:19:28 回复(0)
#include <stdio.h>
#include <math.h>
int main() {
    long n, tmp, tmp1, sum = 0, j = 0;
    while (scanf("%ld", &n) != EOF) {
        for (long i = 1; i <= n; i++) {
            tmp = i;
            tmp1 = i;
            while (tmp1) {
                tmp = tmp1 % 10;
                tmp1 /= 10;
                sum = sum * 10 + tmp;
                j++;
            }
            if (sum == i) {
                printf("%d\n", sum);
            }
            j = 0;
            sum = 0;
        }

    }
    return 0;
}
发表于 2023-02-28 09:09:12 回复(0)

问题信息

上传者:牛客301599号
难度:
40条回答 2055浏览

热门推荐

通过挑战的用户

查看代码
回文对称数