当前课程知识点:C++语言程序设计基础 > 第3章 函数 > 函数调用 > 例3-4
例3-4
l 回文:各位数字左右对称的整数。
l 例如:11满足上述条件
n 112=121,113=1331。
分析:
用除以10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。
#include <iostream>
using namespace std;
//判断n是否为回文数
bool symm(unsigned n) {
unsigned i = n;
unsigned m = 0;
while (i > 0) {
m = m * 10 + i % 10;
i /= 10;
}
return m == n;
}
int main() {
for(unsigned m = 11; m < 1000; m++)
if (symm(m) && symm(m * m) && symm(m * m * m)) {
cout << "m = " << m;
cout << " m * m = " << m * m;
cout << " m * m * m = "
<< m * m * m << endl;
}
return 0;
}
运行结果:
m=11 m*m=121 m*m*m=1331
m=101 m*m=10201 m*m*m=1030301
m=111 m*m=12321 m*m*m=1367631
大家好
欢迎继续学习C++语言程序设计
接下来这一节呢
还是给大家介绍一个例题
这个例题也是要用到函数
这个题目要求我们找回文
而且要找这样的数 m
m的平方 m的三次方
均为回文的数
回文是什么呢
也就是说这个数字
它正着念 反着念是一样的
比如121 它就是一个回文
那我们还要判断
这个数本身
它的平方 它的立方
是不是都是回文
这样两个方面的事情合在一起
对于初学者来讲
又会觉得这个程序无从下手
怎么考虑呢
依然是功能分解
现在我们就来看怎么写程序
来求这个回文的问题
那这道题要求我们求
11到999之间的
符合这样要求的数
符合什么要求呢
m m平方 m立方都是回文
那这里给出一个例子
11就是这样一个数字
11还有11的平方 121
还有11的三次方 它们都是回文
那怎么样去判断
这个区间内任意一个数
是不是回文呢
首先我们来分析一下
要判断从11到999
这个区间之内的所有数
谁满足这样一个条件
那么显然是要用循环的
因为你要遍历
这个区间内的所有的数
要用循环把它全走一遍
要有个循环结构的
另外就是
我们在循环中怎么又去判断
一个数
它的平方
它的三次方都是回文呢
我们仍然用功能分解的方式
把它分开
用一个单独的函数
去判断一个数是不是回文
然后这样的话
这个程序逻辑就简单了
好 判断一个数是不是回文
用什么样的算法呢
那就是把这个数呢
给它颠倒过来 反序一下
然后看一看反序以后的数
跟原来那个数
是不是相等的
如果是相等的
那么它就是回文
现在怎么样将一个数的各个数位
反序呢
那么最简单的办法
大家直觉应该想到
除以10取余
不就每一次
可以取出一个最低位吗
对 就是用这样的办法
就是用除以10取余的办法
不断除以10取余数
那么最早取出来的这个数
就作为最高位
最后取出来那个数
就作为最低位
这样就形成了将一个数字
它的各个位数反序这样的效果
反序以后
我们再比较一下
跟原来是不是相等
那么不就是可以判断
它是不是回文了呢
接下来呢
我们来看一下程序的代码
现在我们首先来写一个函数
用来判断一个数是否回文
好 我们来看这个代码
怎么判断这个数是否回文呢
也就是说
如果这个数正着读
反着读都一样就是回文
那首先第一步
我们就需要把这个数先反转
怎么反转呢
还是用除以10取余的方式
不断地从最低位取出一个数来
但是
不仅仅是从最低位取出个数来
还要达到反转的目的
就是最先从最低位取出来的数
在最终结果数据中
它应该是那个最高位
所以我们看这里
每次除以10取余
将这个结果值
往m上面累加之前呢
m原来的值要乘以10
m的初始值是0
所以
个位数 最低位取出来的时候
是在0的基础上去累加
下一次再累加的时候
就会把以前曾经累加过的值
乘以10 然后再累加上
刚取出来的这个当前最低位
每一次取出一个当前最低位以后
我们就要把这个i的值
真的去除以10
然后只取那个商数
留着下一次用
好 就这样把这个while循环
不断地进行
直到i等于0的时候
就是全部的位数都处理完了
反转以后的数据
也就形成了存到了m里面了
这个时候呢
我们来判断m和n是否相等
就可以了
如果m等于n
这件事为真
就说明这个数正着读
反着读都是一样的
它就是一个回文
如果m等于n这件事情为假
就说明这个数不是回文
所以如何判断一个数是不是回文
这件事
我们用一个独立的函数解决了
接下来呢
在主函数中就方便了
大家看
我们只要用一个for循环
for循环是计数循环
只要用一个for循环
从11开始到999
也就是小于1000 在这个范围内
依次遍历所有的数据
每遍历一次 判断一次m++
也就是m自己自增1
每一次如何去判断一个数
它自己 它平方
它的三次方是不是回文呢
很简单
在这个if的条件里面
连续三次调用这个判断
是否回文的函数
这个symm这个函数
判断m自己 m乘以m
还有m的三次方
它们是否回文
这个函数的返回值应该是真
或者是假 是一个布尔值
所以把三次的返回值
用逻辑语连接起来
进行与运算
与运算的结果如果是真的
那一定这三次调用函数的返回值
都是真
只要有一次是假
与预算的结果就会是假 对吧
所以呢
当这与预算结果为真的时候
就说明m m的平方
m的三次方它们均为回文
也就是这个时候呢
这个if的条件为真
好 那我们只要输出这个m的值
还有它的平方
还有它的三次方就可以了
大家看
经过功能分解
这个题是不是很简单了呢
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)