解题思路:

注意事项: 在这里我用数组从a[0]开始存放数的最低位,a[i]存放高位,便于适应结果数的位数增长,易实现算法

参考代码:

#include<stdio.h>
#include<string.h>
void transform(char s[],int a[]){	//将输入的字符串转换为int型数的集合 
	int i=0;
	while(1){
		if(s[i]>='0'&&s[i]<='9') 
			a[i]=(int)s[i]-48;
		else if(s[i]>='a'&&s[i]<='f')
		    a[i]=(int)s[i]-87;
		else if(s[i]>='A'&&s[i]<='F')
		    a[i]=(int)s[i]-55;
		else break;		
		i++;
	}
}
void reverse(int a[],int b[],int d){	//翻转数字 
	int i;
	for(i=0;i<d;i++)
	b[i]=a[d-i-1];
}
void add(int a[],int b[],int *d,int k){	//相加 
    int fla=0,i,c[100];
    for(i=0;i<*d;i++){
    	c[i]=(a[i]+b[i]+fla)%k;
    	fla=(a[i]+b[i]+fla)/k;
	}
	if(fla!=0){         //最终进位若为非0,则表示d+1位,不为0有效
	 c[i]=fla; i++;       //重新调整数的位数(加1位)
	 }
	  *d=i;
	 for(i=0;i<*d;i++)
	 a[i]=c[i];           //将结果数放置到a[]数组
	
}
int huiwen(int a[],int d){	//判断回文 
	int i,flag=1;
	for(i=0;i<d/2;i++)
	if(a[i]!=a[d-i-1]) flag=0;//若存在1对数不相等,则非回文,返回0,否则返1
	return flag;
}

int main(){
	int a[100],b[100];       //a存初始数(或结果数),b存翻转得到的数
	int k,num=0,d;    //num记录计算次数,d为数a的长度
	char s[100];
	scanf("%d%s",&k,s);
	transform(s,a);
	d=strlen(s);
	while(num<=30){
		reverse(a,b,d);
		add(a,b,&d,k);
		num++;		
		if(huiwen(a,d)) break;    //执行到满足回文数时退出循环,成功!
	} 
	if(num!=31) printf("STEP=%d",num);
	else printf("Impossible!");
	return 0;
}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论