东华oj-进阶题第33题-回文数

在这里插入图片描述

33 回文数

作者: ZhouMingLiang 时间限制: 10S章节: 一维数组

问题描述 :

有一天,明明在做数学作业的时候,发现了一组很有趣的数字。例如1、11、121、1331等等。他发现这些数字都是左右对称的,即不管你把这些数字从左读到右还是从右读到左,读出来的数字都是一样的。于是明明就把这个发现告诉了他爸爸。明明的爸爸是一名数学专家,他当然对这种类型的数字早有研究,他对明明说:“这些是回文数,它是一种特殊的数字现象,即这些数字的左右两边是对称的。例如:121左右两边对称,1331左右也是对称的。”明明觉得这很有趣,接着问他爸爸还有什么和这类回文数有关的好玩的东西,明明的爸爸于是就教了明明一种方法,这种方法是从任意一个整数出发,经过某种计算,就可以得到一个回文数。
这个方法如下:
例如首先给你一个数19,然后把它的最低位与最高位交换(如果还有更多位,则次低位与次高位交换…),得到它的逆序数91,然后两数相加,即19+91=110,我们得到110,因为110不是回文数,因此我们继续上面的步骤,110+11=121,现在我们就得到了一个回文数121。通过这种方法,我们就可以求得一个与某一个整数有关的回文数。
明明很聪明,很快就掌握了这个方法,但是他也发现了一个问题,就是有时候计算一个回文数,需要重复很多次以上的步骤,这使得明明很烦恼。于是他就求助于你,请你帮他写一个程序,通过程序来完成以上求回文数的过程。

明明的问题可以归结为:给你一个整数,通过上面叙述的求回文数的方法,求出回文数,并输出求解过程。输入数据保证该回文数小于2^31
输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行有一个整数n(10≤n≤10000),即要求回文数的那个整数。当n=0时,表示输入结束。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一行或多行的回文数求解过程,直到求出回文数为止。每行的格式如下a+b=c,其中a是原来的数,b是a的交换后的那个数,c是a+b的结果,详细格式请参考输出样例。每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
注:通常,显示屏为标准输出设备。 输入范例 : 88 0 输出范例 : 88+88=176 176+671=847
847+748=1595 1595+5951=7546 7546+6457=14003 14003+30041=44044

代码:

/*
	T33 回文数 
*/

#include<stdio.h>
#define MAX_SIZE 100

int getAntiCw(int n); 
int isPalin(int n);

int main() {
	int n = 0;
	int antiCwN = 0;// n的逆序数 
	int res = 0;// n与它的逆序数的和 
	
	while (1) {
		scanf("%d", &n);
		if (n == 0)
			break;
		
		antiCwN = getAntiCw(n);
		res = n + antiCwN;
		printf("%d+%d=%d\n", n, antiCwN, res);
		while (!isPalin(res)) {
			n = res;
			antiCwN = getAntiCw(n);
			res = n + antiCwN;
			printf("%d+%d=%d\n", n, antiCwN, res);
		}
	}
	
	return 0;
}

// 得到某数的逆序数 
int getAntiCw(int n) {
	int res = 0;
	while (n) {
		res = res * 10 + n % 10;
		n /= 10;
	}
	return res;
}

// 判断某数是否为回文数
int isPalin(int n) {
	int temp = n;
	int len = 0;// 数的长度
	int i = 0;
	int stack[MAX_SIZE] = {0};// 栈,存储一个数的各个位 
	
	while (temp) {// 将数的各个位分离以及计算数的长度 
		stack[++i] = temp % 10; 
		temp /= 10;
		len++;
	} 
	
	for (i = len; i >= len - len / 2; i--) {// 开始比较 
		if (stack[i] != n % 10) 
			return 0;
		n /= 10; 
	}
	
	return 1;
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问或建议,请及时私信沟通。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip 编译原理OJ-语义分析及目标代码生成c++源码.zip 编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip编译原理OJ-语义分析及目标代码生成c++源码.zip 编译原理OJ-语义分析及目标代码生成c++源码.zip
这是一道经典的位运算目,考察对二进制的理解和位运算的熟练程度。 目描述: 给定一个长度为 $n$ 的数组 $a$,初始时每个数的值都为 $0$。现在有 $m$ 个操作,每个操作为一次询问或修改。 对于询问,给出两个整数 $l,r$,求 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 的值。 对于修改,给出一个整数 $x$,表示将 $a_x$ 的值加 $1$。 输入格式: 第一行两个整数 $n,m$。 接下来 $m$ 行,每行描述一次操作,格式如下: 1 l r:表示询问区间 $[l,r]$ 的异或和。 2 x:表示将 $a_x$ 的值加 $1$。 输出格式: 对于每个询问操作,输出一个整数表示答案,每个答案占一行。 数据范围: $1 \leq n,m \leq 10^5$,$0 \leq a_i \leq 2^{30}$,$1 \leq l \leq r \leq n$,$1 \leq x \leq n$ 输入样例: 5 5 2 1 2 3 1 2 4 2 2 1 1 5 输出样例: 0 2 解思路: 对于询问操作,可以利用异或的性质,即 $a \oplus b \oplus a = b$,将 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 转化为 $(a_1 \oplus \cdots \oplus a_{l-1}) \oplus (a_1 \oplus \cdots \oplus a_r)$,因为两个前缀异或后的结果可以相互抵消,最后的结果即为 $a_1 \oplus \cdots \oplus a_{l-1} \oplus a_1 \oplus \cdots \oplus a_r = a_l \oplus \cdots \oplus a_r$。 对于修改操作,可以将 $a_x$ 对应的二进制数的每一位都分离出来,然后对应位置进行修改即可。由于只有加 $1$ 操作,所以只需将最后一位加 $1$ 即可,其余位不变。 参考代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值