Minister 发表于 2020-11-12 10:30

初学C语言_回文数

回文數 數字正序和倒序相同(以下仅讨论正整数)
例如 121, 5 , 198 ....
# include <stdio.h>
/*
回文數 數字正序和倒序相同
例如 121, 5 , 198 ....
*/
int main(void){
      int val;//存放待判定的數字
      int m;
      int sum=0;
      printf("請輸入數字\n");
      scanf("%d",&val);
      m=val;
      printf("m sum\n");
      while(m){
                sum=sum*10+m%10;
                m /= 10;
      }
      if(val==sum)
                printf("yes!\n");
      else
                printf("no\n");
      return 0;
}
模拟执行过程:初始化 sum=0    m=123

sum m
0 123
0*10+123%10=3 12
3*10+12%10=32 1
32*10+1%10=321 0(跳出while)


常规总结
按照数学算法,实际就是看这数没否被11整除,分情况讨论:
1.数<10 本身即为回文数
2.数≥10 能被11整除即为回文数,否则不是


# include <stdio.h>
int main(void){
        int val;                                //存放待判定的數字
        int m;
        int sum=0;
        printf("請輸入數字");
        scanf("%d",&val);
        if(val>10){                               
                if(val%11==0)                //被11整除
                        printf("yes\n");
                else
                        printf("no\n");
        }else{
                printf("yes\n");
        }
        return 0;
}

古月不傲 发表于 2020-12-3 11:36

本帖最后由 古月不傲 于 2020-12-3 11:49 编辑

#include <iostream>
#include <cstring>

using namespace std;

int main() {
    char num{};
    printf("请输入一个数字判断回文数:");
    scanf("%s", num);

    int len = strlen(num);
    char *begin = num;;
    char *end = &(num);
    int count = 0;
    int half = len >> 1;
   
    while (half != 0 && half--) {
      if (*begin == *end) {
            count++;
      }
      begin++;
      end--;
    }
    if (count == len >> 1) {
      printf("是回文数\n");
    }
    else {
      printf("不是回文数\n");
    }
    return 0;
}
时间:O(0.5N) 不管是奇数个,还是偶数个,构建头尾指针,对比一半即可。

drophair 发表于 2020-11-12 12:14

本帖最后由 drophair 于 2020-11-12 12:16 编辑

回文串用string读入,然后再开一个string存放经过reverse处理的字符串,两者进行对比,如果相等就是回文串#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    cin>>a;
    b=a;
    reverse(a.begin(),a.end());
    if(a==b)
    {
      cout<<"是回文串"<<endl;
    }
    else
    {
      cout<<"不是回文串"<<endl;
    }
}

这种方法不光适用于数字还可以用在字符串
简简单单有手就行 /滑稽

zfzhhh 发表于 2020-11-12 11:30

898是不是回文数,

layuai 发表于 2020-11-12 11:32

用数组感觉更方便存放计算

lxwx 发表于 2020-11-12 11:50

你这个算法有问题,11的倍数可不一定是回文数,比如132,143,回文数也未必是11的倍数,比如101,111。

西楠 发表于 2020-11-12 11:51

一个自然数,如果从左向右看和从右向左看数字都一样,换句话说,就是“数字排列左右对称”,就把它叫做“回文数”。比如121、5335、6084806都是回文数。当然,由同一个数字组成的数,如11,999也是回文数。

Minister 发表于 2020-11-12 12:01

lxwx 发表于 2020-11-12 11:50
你这个算法有问题,11的倍数可不一定是回文数,比如132,143,回文数也未必是11的倍数,比如101,111。

:lol 对对对 整除11跟 回文有交集 但不必然

drophair 发表于 2020-11-12 12:05

zfzhhh 发表于 2020-11-12 11:30
898是不是回文数,

898怎么不是回文数?

lxwx 发表于 2020-11-12 12:10

drophair 发表于 2020-11-12 12:05
898怎么不是回文数?

他的意思是898虽然是回文数,但在你的程序里就不是了。。

鸭子咯咯哒~ 发表于 2020-11-12 12:10

算法好难,看不懂{:1_937:},怎么学的
页: [1] 2
查看完整版本: 初学C语言_回文数