1155.回文三位数

题目:如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,求出所有的既是回文数又是素数的三位数。

先放代码:

#include<iostream>
#include<cstdio>
using namespace std;
bool isZhi(int a)
{
    if(a==1)return false;
    for(int i=2;i<a;i++)
    {
        if(a%i==0)return  false;
     }
     return true;
}
int main()
{
    for(int i=100;i<1000;i++)
    {
        if(isZhi(i)&&i/100==i%10)
           cout<<i<<endl;
    }
}

isZhi返回参数是否为质数。main中i/100和i%10分别获取i的第三位和第一位。

然后完美通关!

怎么还有?

很明显,上述代码只适用于三位数。更高位数就无能为力了。

于是,在我苦思冥想并且嫖了网上几段代码后,我编写了更加通用的代码。

思路:从数字的第一位和最高位分别向中间逼近,遇到不同的数字则表明不是回文数。

于是,我先写了获取数字位数的函数:

int get_length(int a)
{
    int leng=0;
    while(a)
    {
        a/=10;
        leng++;
    }
    const int _leng=leng;
    return _leng;
}

所得数字不断除以10,每除一次位数+1.除到0则停止,此时代表所有的位数都已算尽。

考虑到可能需要常量,我进行了常量转化。当时第一版我使用的是字符串保存数字,但不太好使放弃了。这个常量转化可以忽略了。

然后是获取某一个数字(第一个形参)的某一位(第二个形参)的数字。

int getCertainNumOfInt(int a,int num)
{
    int ten=1,q;
    for(q=1;q<num;q++)
    {
        ten*=10;
    }
    int r=a/ten%10;
    return r;
}

以12345为例,假设我们要获取第3位数,此时ten变量的值是100,12345/100=123,再用10对123取余,获得3即为第三位数。

最后是检验回文数的函数:

bool isBack(int a)
{
    int len=get_length(a);
    for(int i=1;i<=len;i++)
    {
        if(getCertainNumOfInt(a,i)!=getCertainNumOfInt(a,len-i+1))
        return false;
    }
    return true;
} 

第六行是重点,i为从低位到高位的检查,len是长度。len-i+1是从高位到低位的检查(+1是因为,i原先就是1,不加1会使函数从数字次高位开始检查,漏掉最高位)。一旦检查到不同的数字就返回假。若所有数字都检查完毕,还没有发现不同的数字,则证明是回文数,返回真。

或许可以将第四行的len改为len/2,因为两个检查量到中间时就已经能判断是否为回文数了。

最后是main:

int main()
{
    for(int p=100;p<=999;p++)
    {
        if(isBack(p)&&isZhi(p))
        cout<<p<<endl;
    }
}

此时的p可扩展到任意正整数,不受位数限制。

真♦完美通关!

原文地址:https://www.cnblogs.com/jiangyuechen/p/12234855.html

时间: 2024-10-16 02:41:26

1155.回文三位数的相关文章

检测一个字符串是否为回文? 两种方法

/** *    检测一个字符串是否为回文?三种方法? *    方法1:用str.charAt(index) !=  str.charAt(len-i-1) *    方法2:用StringBuilder . reverse反转 *    方法3:用开关控制 */ public class reversChar { public static void main(String[] args) { String str = "123321"; //中文也可以 System.out.pr

一个5位数,判断它是不是回文数

题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 1 package com.li.FiftyAlgorthm; 2 3 import java.util.Scanner; 4 5 /** 6 * 题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 7 * @author yejin 8 */ 9 public class Palindrom { 10 public static void main(Strin

输入任意一个5位数,判断其是否是回文数

输入任意一个5位数,判断其是否是回文数.所谓的回文数是指其个位与万位相同,并且十位与千位相同,比如:12321或者54645: #include <stdio.h>void main(){   int n=0;    printf("请输入任意一个5位数\n");    scanf("%d",&n);   n%10==n/10000&&(n/10)%10==(n/1000)%10 ? printf("%n是一个回文数&q

三个 编程题 :1. 回文 2. 将字符串t连接到字符串s的尾部

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

输入任意一个5位数,判断其是否是回文数。

#include <stdio.h>void main(){ int a; printf("请输入一个5位数"); scanf("%d",&a); (a/10000==a%10&&(a/1000)%10==(a/10)%10)?printf("是回文数\n"):printf("不是回文数\n");} 输入任意一个5位数,判断其是否是回文数.,布布扣,bubuko.com

(三)、利用命令行参数输入多个参数,判断该数组是否为回文数组

1 /* 2 利用命令行参数输入多个参数,并赋值给一数组,同时判断该数组是否为回文数组 3 –PS:例如数组{“123”,”222”,”333”,”222”,”123”}就是回文数组,即元素倒置过后与原元素一样 4 */ 5 package com.gen; 6 public class ArgumentHuiwen { 7 public static void main(String args[]) 8 { 9 int num[]=new int[100]; 10 int len=args.l

回文素数-2015校内选拔第三题

10301是个5位的素数.它有个特点,把数字倒过来还是它本身,具有这样特征的素数,我们称之为:回文素数. 105011060111311 这些都是5位的回文素数. 请你计算一下,像这样的5位数的回文素数,一共有多少个? 请填写这个表示个数的整数,注意不要写任何其它多余的内容,比如说明或解释文字,也不要列出所有的回文素数. 原文地址:https://www.cnblogs.com/jinyufanfan/p/10105434.html

python中3位数中的水仙花数,和5位数中回文数的个数

3位数中的水仙花数打印num=100 e=0while num<1000: b=num%10 c=num//10%10 d=num//100 if b**3+c**3+d**3==num: e+=1 print (num) num+=1print (e) 5位数中的回文数的个数 num=10000e=0while num<=99999: a=num//10000 b=num//1000%10 c=num%100//10 d=num%10 if a==d and b==c: e+=1 print

c语言练习3——判断一个5位数是否回文数

#include<stdio.h> #include<stdlib.h> /*题目:判断一个五位数是否为回民数.*/ int main(){ int a,a1,a2,a3,a4,a5; while(1){ printf("请输入一个5位数:"); scanf("%d",&a); a1=a%10; a2=a/10%10; a3=a/100%10; a4=a/1000%10; a5=a/10000; if(a1==a5&&