知识点总结:

islower(ch)//判断ch是否为小写字母 

memset(b,0,sizeof(b));//数组b清零 

回文数判断:

bool check(int a[]){
	for(int i=0;i<len;i++){
		if(a[i]!=a[len-1-i]){
			return false;
		}
	}
	return true;
}

n//表示几进制,string s;//表示输入的字符串

a[100]两个方面的作用:

(1)前期用来获取s中的字符,将其转化为数字存放
(2)在高精度加法中,将每一位相加的和取余存放于a[]

b[]作用:

主要起辅助作用,将a[]中的内容倒过来存放

思路:

  1.如果a直接是回文数,则不need一步可以==>  cout<<0<<endl;return 0;

  2.遍历ans---from 0 to 30

准备task:数组b清零;接着将a[]中的内容倒过来存放;

高精度加法套路:

r=0;//进位数,d=0//数组每个位置上之和+进位数

	int r=0,d;
	 	for(int i=0;i<len;i++){
	 		 d=a[i]+b[i]+r;
			 r=d/n;
			 a[i]=d%n;
	 	}
	 	if(r!=0){
	 		a[len++]=r;
	 	}

参考代码:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int n,len,count;
int a[100],b[100];
bool check(int a[]){
	for(int i=0;i<len;i++){
		if(a[i]!=a[len-1-i]){
			return false;
		}
	}
	return true;
} 
int main(){
	int l;
	string s;
	cin>>n>>s;
    len=s.length();
	for(int i=0,j=0;i<len;i++){
		if(s[i]>='0'&&s[i]<='9'){
			a[j++]=s[i]-'0';
		}
		else{
			a[j++]=islower(s[i])?s[i]-'a'+10:s[i]-'A'+10;
		}
	}
	if(check(a)){
		cout<<"0"<<endl;
		return 0;
	}
/*-----------------------------------------------------------------*/	 
	 for(int ans=1;ans<=30;ans++){ 
	    l=len;
	    //数组b清零 
	    memset(b,0,sizeof(b));
	    for(int i=0;i<l;i++){
	 	   b[i]=a[l-1-i];
	    } 
	    /*--高精度加法的固定套路,将结果放在数组a中----------------*/
	 	int r=0,d;
	 	for(int i=0;i<len;i++){
	 		 d=a[i]+b[i]+r;
			 r=d/n;
			 a[i]=d%n;
	 	}
	 	if(r!=0){
	 		a[len++]=r;
	 	}
	 	/*---------------------------------------------------------*/
	 	count++;
	 	if(check(a)){
	 		cout<<count<<endl;
	 		return 0;
	 	}
	 } 
	 cout<<"Impossible"<<endl;
	 return 0; 
}

PS:欢迎小伙伴多多交流!!!

后期会完善代码及解题思路~~

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论