、、5、、回文数的一道题目

回文数就是形似“12345678987654321”一样金字塔型的数字,是模型题目考察的常客了,许多题目都是基于这个来演变的。下面是例题:
在这里插入图片描述
这个程序,分析一下,按照我的水准,就直接当作十位进制来算就好了,于是我就构思了三个模块:
1、回文数的判断 (如果是回文数了,就直接输出0,如果不是就在接着弄下面的函数)
2、将输入的数和逆置之后的数加起来,再判断
3、输出累加的次数。

当然,我想的确实是太简单了,思路应该是对的,不过脑子里装的一些代码或者头文件,确实太少了,下面是我的代码:


#include<iostream>
using namespace std;
int a[100];
int F(int M) {
	int N = M, n = 0;
	while ((N % 10) != 0) {
		a[n] = N % 10;
		N = N / 10;
		n++;
	}
	int i = 0;
	while (i < n) {
		if (a[i] == a[n - 1]) { i++; n--; return 1; }
		else { return 0; break; }
	}
}


int main()
{
	int m, M;
	cin >> m >> M;
	if (F(M) == 1)cout << "1";
	else {
		int N = M, n = 0, p = 0, k = 0;
		while (F(M) != 1) {
			while ((N % 10) != 0) {
				a[n] = N % 10;
				N = N / 10;
				n++;
			}
			for (int m = 0; m < n; m++) {
				k = k * 10 + a[m];
			}
			M += k;
			p++;
		}
		cout << p;
	}
	return 0;
}

将每一个数进行判断,然后p每次累加,可是在出结果的时候,这个p比要的数大2,不论输入啥都是这个样子。
于是我只好求助一下题解里面的大佬们,发现了一个巧妙地东西,bool类型。
bool类型就是根据结果的return为true或false来给回归值,return为true就是1,false就是false,和我需要的判断条件是符合的。
题解的判断函数如下:

inline bool pd()
{
	for (int i=0;i<l;++i)
		if (c[i]!=c[l-1-i]) return false;
	return true;
}

使用bool直接返回1或0,再加上下面这个循环,就可以将数加起来了:

while (!pd())
	{
		++step;
		if (step>30) break;
		add();
	}

add()函数是添加函数。

下面是大佬的所有代码:

#include <cstdio>
#include <cstring>
const int S=303;//一次加法顶多多一位,所以顶多多30位,也就是130位左右。我开大一点,开到300.
int n,a[S],l;
char c[S],d[S];
inline void add()
{
	for (int i=0;i<l;++i)
		d[l-i-1]=c[i];
	l+=2;//可能有进位,所以我们干脆在前面先多空个两位
	for (int i=0;i<l;++i)
	{
		c[i]+=d[i];
		if (c[i]>=n) c[i+1]++,c[i]-=n;
	}
	while (!c[l-1]) --l;//大不了多余的前导0再减回来嘛~~简化思维~~
}
inline bool pd()
{
	for (int i=0;i<l;++i)
		if (c[i]!=c[l-1-i]) return false;
	return true;
}
int main()
{
	scanf("%d%s",&n,c);l=strlen(c);
	for (int i=0;i<l;++i)
	{
		if (c[i]>='0' && c[i]<='9') c[i]-='0';
		else c[i]=c[i]-'A'+10;
	}
	int step=0;
	while (!pd())
	{
		++step;
		if (step>30) break;
		add();
	}
	if (step<=30) printf("STEP=%d\n",step);
	else puts("Impossible!");
	return 0;
}

两个字符数组来记录所有可能的位数,n表示进制位,l表示输入的字符个数。
录入每一个字符,对其进行一个判断,如果出现了一个不符合回文数判断的就会判错,接着就会进入到累加的循环,累加之后也要判断是否为回文数,不是的话,如上循环。其中每次的累加之后会接一个记次数的++,当它小于三十且可以变成回文数,就能输出,大于或等于30,就会出“impossible”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值