C++ 洛谷p1015回文数

洛谷p1015简单思路

//记录自己的码字之路
//如发现问题或有疑虑,欢迎评论!

友情提示:
为防止抄袭,本代码已做过一定手脚,请勿复制粘贴,否则后果自负

先赞再看,AC不断

题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个十进制数 56,将 56加 65(即把 56 从右向左读),得到 121 是一个回文数。

又如:对于十进制数 87:

STEP1:87+78=165
STEP2:165+561=726
STEP3:726+627=1353
STEP4:1353+3531=4884

在这里的一步是指进行了一次 N 进制的加法,上例最少用了 4 步得到回文数 4884。

写一个程序,给定一个 N(2≤N≤10 或 N=16)进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出 Impossible!。

输入格式

两行,分别是 N,M。

输出格式
如果能在 30 步以内得到回文数,输出格式形如 STEP=ans,其中 ans为最少得到回文数的步数。否则输出 Impossible!。

简单分析

粗略看一下题目,自认为就是一道极其简单的辨别回文数,以及数字转换的题,只是洛谷工作人员没有把他放到“入门”罢了
基本码完代码,习惯性回到题目瞧一眼才突然看见一个突兀的数字:100 位之内,以及一个可怕的短语:N进制数,当时心态就崩了。。。

这两个东西构成了两个词:高精度、字符串,头发一下掉了几百根

还好编写过程顺利,一次调试对。。。

高精度怎么写应该不用再讲了吧

这题我用了很多函数,因为会重复执行多次,还可以让程序更具条理,具体解释看注释解释吧(先看主函数哦)

废话不多说,上代码

#include <bits/stdc++.h>//Van能头
using namespace std;
int n,len;
int a[200],b[200],c[200];//数组多开一点,谨防看错数位
string s;
void add(){//套用高精加模板
    for(int i=0;i<len;i++){
        c[i]+=a[i]+b[i];
        c[i+1]+=c[i]/n;//考虑到会出现其他进制,10改成n,能起到一样的效果
        c[i]%=n;
    }
    if(c[len]!=0) len++;
    //pay attention!
    //这里为了让len可以一直用下去,而不是每次求一次len,所以不同于普通的高精
    for(int i=0;i<len;i++) a[i]=c[i];//把加好的c赋值给a
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    //将bc清零,等待马上再用
}
bool ishw(int as[]){//判断回文,常规操作
	for(int i=0;i<=len/2;i++)
		if(as[i]!=a[len-i-1]) 
		    return false;
	return true;
}
void change(string as){
	len=as.size();//计算length
	for(int i=0;i<len;i++){
		if(as[i]>'9')
			a[len-i-1]=as[i]-55;
			//pay attention!
			//这里可以出现16进制,会有A~E几个大写字母,分开处刑
	    else
	    	a[len-i-1]=as[i]-48;
	}
}
void back_b(){//把新的b算好放到数组当中
	for(int i=0;i<len;i++) b[i]=a[len-i-1];//倒序存储
}
int main(){
	//自己写输入
	change(s);//把s转换成数组,不要动进制,保留原来进制
	for(int i=0;i<30;i++){
		add();//适用于不同进制的高精加
		//判断数组是否回文
		if(ishw(a)==true){//是就输出,结束
			pf("%d",i);
			return 0;
		} 
		back_b();//把新的b算好放到数组当中
	}
	pf("Impossible");
	return 0;
} 

看完代码记得自己再敲一遍!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值