叮咚叮咚


私信TA

用户名:13060009323

访问量:9497

签 名:

敲代码是一种工科生的艺术

等  级
排  名 4138
经  验 1756
参赛次数 0
文章发表 16
年  龄 21
在职情况 学生
学  校 四川工商学院
专  业

  自我简介:

解题思路:

注意事项: 在这里我用数组从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 人评分

  评论区

  • «
  • »