【C++】回文数专项练习

如果一个数从左边读和从右边读都是同一个数, 就称为回文数
解答:

思想最简单的方法就是模拟,把各个数位取出来,然后比较。当然这种方法比较麻烦。
我们这次要用的方法如下:既然是回文数,那我们把各个数位上的数 正着 加起来跟 逆着 加起来的 和 是一样的。运用这条性质我们就可以很简单的解决这个问题。代码如下:

#include <iostream>
using namespace std;int main(){int n;cin>>n;int x = 0;int s = n;    // 拷贝一份while(s>0){x = x*10+s%10;    //反向求和,s%10为取s的个位数,例,123取3s = s/10;        // 删除s的个位数,例,123变成12}if(x==n){cout<<"YES!"<<endl;}else{cout<<"NO!"<<endl;}return 0;
}

定义
  记字符串w ww的倒置为w R w^Rw
R
。例如( a b c d ) R = d c b a (abcd)^R=dcba(abcd)
R
=dcba,( a b b a ) R = a b b a (abba)^R=abba(abba)
R
=abba。

对字符串x,如果x xx满足x R = x x^R=xx
R
=x,则称之为回文;例如abba是一个回文,而abed不是。

一、判断回文数
法一
思路:
  将原数字倒序,比较是否还和原数相同。

特点:
此方法只适用于判断回文数,不能判断回文字符串。
此方法可以去除回文数可能存在的前导0再进行判断。

#include <iostream>
using namespace std;
int main() {int n, t, s = 0;cin >> n;t = n;			//拷贝一份nwhile (t) {		//将t倒序存入s中,注意此方法会去除前导0s = 10 * s + t % 10;t /= 10;}s == n ? cout << "yes" : cout << "no";return 0;
}

法二
思路:
  用字符串读入,双指针判断对称位置字符是否相同。

特点:
此方法适用于判断回文字符串。
此方法不可去除数字可能存在的前导0。

#include <iostream>
using namespace std;
int main() {string s;cin >> s;int i = 0, j = s.size() - 1;bool ok = true;				//标记是否为回文串while (i <= j) {if (s[i] != s[j]) {ok = false;break;}i++, j--;				//更新指针}ok ? cout << "yes" : cout << "no";return 0;
}

法三
思路:
  利用string读入,使用库中的翻转函数reverse()将字符串直接翻转,进行比较。

特点:
  代码简洁,可读性高,不易出错。

#include <iostream>
#include <algorithm>
using namespace std;
int main() {string s, t;cin >> s;t = s;reverse(t.begin(), t.end());s == t ? cout << "yes" : cout << "no";return 0;
}

1.回文数个数
思路:
  为了表述的简洁性,这里我们定义一个函数 c n t ( n ) cnt(n)cnt(n) ,表示 n 位数的回文数总个数。再定义一个函数 n u m ( n ) num(n)num(n),表示 n 位数的总个数。

根据回文数的定义,很显然任何 1 位数都是回文数,即 c n t ( 1 ) = 10 cnt(1) = 10cnt(1)=10。

回文数具有对称性,即关于中间的哪个数字镜面对称。那么我们就可以通过枚举左边一半的数字来构造一个回文数字。例如:左边一半是12,我们可以构造一个 3 位回文数121,我们也可以构造一个 4 位回文数1221。很显然,任意一个2位数字都可以构造成一个三位回文数和一个四位回文数,而任意一个三位回文数或四位回文数也唯一对应着一种构造方式。那么既然具有这种对应的关系,我们就可以确认:c n t ( 3 ) = c n t ( 4 ) = n u m ( 2 ) cnt(3)=cnt(4)=num(2)cnt(3)=cnt(4)=num(2)。

将以上方法进行拓展,我们就可以将一个回文数与一个自然数取得对应关系。也就是说,任意一个回文数我们都能找到它的唯一构造方式。

例如:12321是由123构造得来,99是由9构造得来,1001是由10构造得来…

顺理成章地,我们得到如下关系:
对于 ∀ n ∈ N ∗ ,均满足 c n t ( 2 n ) = c n t ( 2 n − 1 ) = n u m ( n ) 对于 \forall n\in N^*,均满足 cnt(2n) = cnt(2n-1) = num(n)
对于∀n∈N

,均满足cnt(2n)=cnt(2n−1)=num(n)

这样一来,我们把一个相对复杂的问题转化成了一个较简单的问题,即求 n u m ( n ) num(n)num(n)。这是数学上一种重要的思想:化归思想。

一个 n 位数的个数很容易得到,即 1 0 n − 1 0 n − 1 10n-10{n-1}10
n
−10
n−1
,也就是 9 ∗ 1 0 n − 1 9*10^{n-1}9∗10
n−1
.

综上,我们得到了这个问题的答案:对于 ∀ n ∈ N ∗ ,均满足 c n t ( 2 n ) = c n t ( 2 n − 1 ) = 9 ∗ 1 0 n − 1 对于 \forall n\in N^,均满足 cnt(2n) = cnt(2n-1) = 910^{n-1}对于∀n∈N

,均满足cnt(2n)=cnt(2n−1)=9∗10
n−1
.

#include <iostream>
#include <cmath>
using namespace std;
int main() {int n;				//输入位数 ncin >> n;if (n & 1)	n++;	//如果n是奇数n >>= 1;			//无论奇偶都要除以2cout << 9 * pow(10, n - 1);return 0;
}

描述

一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。

输入

位数 n ,其中1<=n<=9。

输出

第一行输出满足条件的素数个数。 第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分。

样例输入

1

样例输出

4 2 3 5 7
思路:
  在这里我们还是分位数来讨论。

一位数都是回文数,那么显然只要满足质数即可。一位回文素数有 4 个:2 3 5 7.

两位数的回文数有9个,我们也很容易能看出来,除了11是质数外,其余的都是11的倍数,显然是合数。即:两位回文数有 1 个:11.

受此启发:我们不禁产生疑问,回文数具有如此优美的对称性,11的倍数也有一定的对称性,它们之间有没有什么联系呢?

答案是有的。

首先, 我们要有一定的前置知识,这属于小学奥数的范畴:如何判断一个数字是否为11的倍数:将该数字的奇数位相加的和与偶数位的和做差,差是11的倍数,则原数是11的倍数,否则不是。

例如:
  1234, ( 1 + 3 ) − ( 2 + 4 ) = − 2 (1+3)-(2+4)= -2(1+3)−(2+4)=−2,不是11的倍数,故1234不是11的倍数。

1089:( 1 + 8 ) − ( 0 + 9 ) = 0 (1+8)-(0+9)=0(1+8)−(0+9)=0,是11的倍数,故1089是11的倍数。

1221:( 1 + 2 ) − ( 2 + 1 ) = 0 (1+2)-(2+1)=0(1+2)−(2+1)=0,是11的倍数,故1221是11的倍数。

于是我们发现:除11外,任意偶数位的回文数,均位11的倍数,即合数。 理由如下:

任意偶数位回文数形式为:a b c d . . . x x . . . d c b a abcd…xx…dcbaabcd…xx…dcba,其奇数位的和为 a + c + . . . + x + . . . + d + b a+c+…+x+…+d+ba+c+…+x+…+d+b,偶数位的和为 b + d + . . . + x + . . . + c + a b+d+…+x+…+c+ab+d+…+x+…+c+a,二者均等同于 a + b + c + d + . . . + x a+b+c+d+…+xa+b+c+d+…+x,故差一定为0,即此回文数为11的倍数,为合数。

由此,我们探究出了1位和偶数位的回文数与素数的关系。至于其他位数的回文数与素数的关系,我们就只能逐个判断了。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
void print(int x) {if (x == 1) {cout << 4 << endl << "2 3 5 7";return;}if (x == 2) {cout << 1 << endl << 11;return;}if (!(x & 1)) {cout << 0 << endl;return;}int i, j;vector<int> a;						//保存素数int l = pow(10, x / 2);int r = pow(10, x / 2 + 1);for (i = l; i < r; i++) {			//枚举所有ceil(x/2)位数if (!((i / l) & 1))				//小优化,如果最高位是偶数,即构造出来的回文数i += l;						//是偶数,则其一定不是质数,那么直接跳过这些数int t = i, p = i / 10;while (p) {						//构造其对应的回文数tt = 10 * t + p % 10;p /= 10;}bool ok = true;for (j = 2; j <= t / j; j++) {	//简单的判断素数if (t % j == 0) {ok = false;break;}}if (ok)a.push_back(t);}cout << a.size() << endl;for (auto it = a.begin(); it != a.end(); it++)cout << *it << " ";
}
int main() {int n;cin >> n;print(n);return 0;
}

练习题一:
回文数的定义为:如果把一个数的各个数位上的数字颠倒过来得到的新数与原数相等,则此数是回文数,例:7,22,131,2112,31013,…都是回文数。 对任意给出的一个整数n,经过一系列的处理,最后都能成为回文数。处理的方法是,该数加上它的颠倒数,
例如:n=176
第一次处理后    176+671=847
第二次处理后    847+748=1595
第三次处理后    1595+5951=7546
第四次处理后    7546+6457=14003
第五次处理后    14003+30041=44044
此时成为回文数,共进行5次处理。
问题:给出n 后,求出使该数按照以上规则进行一系列处理后成为回文数的最少操作次数。

输入数据
n 一个整数(n 为int范围内数据,并保证计算过程产生的最大数据范围不会超出long long范围)

输出数据
使n成为回文数的最少处理次数。 若开始给出的n是回文数,则输出0(即不需任何处理)。

# include <bits/stdc++.h>
using namespace std;
long long n,num=0;
long long fan(long long h)
{long long i=0;while (h!=0){i=i*10+h%10;h/=10;}return i;
}
void hw(long long x)
{if (x==fan(x)){cout<<num;return ;}else{num+=1;hw(x+fan(x));}
}
int main(){cin>>n;hw(n);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI自定义ButtonStyle

SwiftUI自定义ButtonStyle 记录一下如何通过自定义SwiftUI自定义ButtonStyle&#xff0c;来给按钮设计一个点击样式 import SwiftUI /*本文章 通过创建ButtonStyle&#xff0c;来自定义按钮的点击动画*/struct PressButtonStyle: ButtonStyle {func makeBody(configuration: …

2024-03-14 Android app runOnUiThread 函数,它的作用是让一个Runnable对象在主线程(UI线程)上运行。

一、看到别人app有这么一个runOnUiThread 函数用法。 二、在Android中&#xff0c;runOnUiThread 是一个非常重要的方法&#xff0c;它的作用是让一个Runnable对象在主线程&#xff08;UI线程&#xff09;上运行。在Android中&#xff0c;主线程是负责更新UI的线程&#xff0c;…

在rollup中想使用require 写node脚本

如果在使用 Rollup 写 require 而 Rollup 默认使用的是 ECMAScript 模块系统。 要解决这个问题&#xff0c;你需要在 Rollup 的配置文件&#xff08;通常是 rollup.config.js&#xff09;中使用插件来将 CommonJS 模块转化为 ECMAScript 模块。需要配置2个插件 import resolv…

【JVM】GCRoot

GC root原理 通过对枚举GCroot对象做引用可达性分析&#xff0c;即从GC root对象开始&#xff0c;向下搜索&#xff0c;形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用&#xff0c;没有形成引用链&#xff0c;那么该对象等待GC回收。 可以作为GC Roots的对…

基于SSM SpringBoot vue办公自动化计划管理系统

基于SSM SpringBoot vue办公自动化计划管理系统 系统功能 登录注册 个人中心 员工信息管理 部门信息管理 会议管理 计划管理 行程安排管理 行程进度管理 管理员管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端…

手搭手RocketMQ重试机制

环境介绍 技术栈 springbootmybatis-plusmysqlrocketmq 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 dynamic-datasource 3.6.1 mybatis-plus 3.5.3.2 rocketmq 4.9.4 加入依赖 <dependencies><dependency><…

《Python深度学习》阅读笔记

以下是《Python深度学习》一书中学习过程中记录的一些重要的专属名词和概念&#xff1a; 一、概念 深度学习&#xff08;Deep Learning&#xff09;&#xff1a;指使用多层神经网络进行机器学习的技术。神经网络&#xff08;Neural Network&#xff09;&#xff1a;一种模仿生…

K8S下微服务平滑发布的一些思考与总结

目录 0. 平滑发布的概念解释 1. k8s的下一些知识点 2. Springboot 健康检查 3. ribbon的客户端负载均衡机制 4. 实现方案一 5. 实现方案二 6. 参考 0. 平滑发布的概念解释 在发布工程中&#xff0c;老的版本所有的请求处理完毕&#xff0c;新的请求正确的请求到新的节点…

SpringBoot打造企业级进销存储系统 第五讲

package com.java1234.repository;import com.java1234.entity.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;import java.util.List;/*** 菜单Repository接口*/ public interface MenuReposit…

第二百零五回

文章目录 概念介绍响应方法滑动事件点击事件 经验总结 我们在上一章回中介绍了如何给ListView添加分隔线,本章回中将介绍ListView响应事件相关的知识.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的ListView响应事件主要分两种类型&#xff0c;一种…

【深度学习模型移植】用torch普通算子组合替代torch.einsum方法

首先不得不佩服大模型的强大之处&#xff0c;在算法移植过程中遇到einsum算子在ONNX中不支持&#xff0c;因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法&#xff0c;但是该方法会…

【Flask开发实战】项目介绍-防火墙规则查询系统

一、前言 硬件防火墙为常备主用网络安全设备&#xff0c;主要通过网络访问控制方式实现安全防护。 不同厂家防火墙的网络访问控制功能均采用同样的模式操作&#xff1a;防火墙配置若干条防火墙规则&#xff0c;当IP包到来&#xff0c;防火墙根据包的五元组属性&#xff08;协…

Python学习笔记之math库的使用

一、平方&#xff0c;m的n次方 math.pow(x, y)是返回x的y次幂 语法 import matha math.pow(3, 2)print(3的2次方, a)# 输出结果为3的2次幂&#xff0c;为9二、开平方 math.sqrt(x)返回x的算术平方根 语法 import mathb 100print(math.sqrt(b)) # 输出结果为10 三、弧度制与…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

【MatLab】之:Simulink安装

一、内容简介 本文介绍如何在 MatLab 中安装 Simulink 仿真工具包。 二、所需原材料 MatLab R2020b&#xff08;教学使用&#xff09; 三、安装步骤 1. 点击菜单中的“附加功能”&#xff0c;进入附加功能管理器&#xff1a; 2. 在左侧的“按类别筛选”下选择Using Simulin…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

购票小程序有哪些功能

​通过小程序购买电子票&#xff0c;然后在使用时&#xff0c;出示电子票二维码&#xff0c;由商家进行验证/核销。通过小程序购票和核销&#xff0c;使得整个流程非常顺利&#xff0c;免去了线下购票的繁琐&#xff0c;而且还容易遗失。下面我们就来具体看一下小程序如何进行购…

3月16日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 广汽传祺官宣加入华为鸿蒙生态 &#x1f30d; 国家数据局&#xff1a;加快构建全国一体化算力网 推动建设中国式现代化数字基座 &#x1f30b; 中国首个超深气田累产天然气突破800亿立方米 &#x1f381; 东方甄选客服回…

Postman进行Websocket接口测试

Postman进行Websocket接口测试 前言下载地址使用1、new一个一个WebSocket Request2、填写内容和需要请求头携带的参数3、表示成功 网页请求101表示握手成功 前言 有些较低版本postman不支持websocket接口测试&#xff0c;如果根据此文未找到创建websocket接口测试的目录&#…

c语言:于龙加

于龙加 任务描述 于龙同学设计了一个特别的加法规则&#xff0c;加法被重新定义了&#xff0c;我们称为于龙加。 两个非负整数的于龙加的意义是将两个整数按前后顺序连接合并形成一个新整数。 于龙想编程解决于龙加问题&#xff0c;可是对下面的程序他没有思路&#xff01; …