1045 迴文數

題目描述 Description

若一個數(首位不爲零)從左向右讀與從右向左讀都一樣,我們就將其稱之爲迴文數。

    例如:給定一個10進制數56,將56加65(即把56從右向左讀),得到121是一個迴文數。

   

    又如:對於10進制數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,求最少經過幾步可以得到迴文數。

    如果在30步以內(包含30步)不可能得到迴文數,則輸出“Impossible!”

輸入描述 Input Description

n和m

輸出描述 Output Description

步數

樣例輸入 Sample Input

9

87

樣例輸出 Sample Output

STEP=6

數據範圍及提示 Data Size & Hint

e



配了半天。。。又點亂
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
char m[50]={0};


bool check(){
	int tmp = strlen(m),i;
	for(i=0;i<tmp/2;i++){
		if(m[i]!=m[tmp-1-i])
		return false;
	}
	return true;
}

void sum(){
	int tmp = strlen(m);
	char a[50]={0};
	char b[50]={0};
	char c[50]={0};
	int z=49;
	for(int i=0;i<tmp;i++){
		a[z]=m[i];
		b[z--]=m[tmp-1-i];
	}
	
	z=49;
	int s;
	c[49]='0';
	while(a[z]){
		//s=a[z]-'0'+b[z]-'0'+c[z]-'0';
		int x,y,zz;
		if(a[z]>='0'&&a[z]<='9')
		x=a[z]-'0';
		else
		x=a[z]-55;
		
		if(b[z]>='0'&&b[z]<='9')
		y=b[z]-'0';
		else
		y=b[z]-55;
		
		if(c[z]>='0'&&c[z]<='9')
		zz=c[z]-'0';
		else
		zz=c[z]-55;
		
		s=x+y+zz;
		
		int k=s%n,k1=s/n;
		
		if(k>=10)
		k+=55;
		else
		k+=48;
		if(k1>=10)
		k1+=55;
		else
		k1+=48;
		
		
		c[z]=k;
		c[z-1]=k1;
		z--;
}
	int j=0;
	if(c[z]=='0')z++;
	for(;z<50;z++){
		m[j++]=c[z];
	}
		m[j]=0;
}

int main(){
	scanf("%d %s", &n, m);
	//判斷是否是迴文數
	if(check())
	{
		printf("STEP=0\n");
		return 0;
	}
	for(int i=0;i<30;i++){
		//加
		sum();
		//判斷是否是迴文數 
		if(check())
		{
			printf("STEP=%d\n",i+1);
			return 0;
		}	
	}
	printf("Impossible!\n");
	return 0;
}




發佈了188 篇原創文章 · 獲贊 78 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章