木子CoCo~


私信TA

用户名:uq_78084890535

访问量:8484

签 名:

等  级
排  名 1171
经  验 3135
参赛次数 1
文章发表 24
年  龄 20
在职情况 学生
学  校 泰州学院
专  业 计算机科学与技术

  自我简介:

努力是奇迹的别名!

知识点总结:

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分

8 人评分

  评论区

  • «
  • »