初學高精度複習一道老題——n進制迴文數(noip1999)

若一個數(首位不爲零)從左向右讀與從右向左讀都一樣,我們就將其稱之爲迴文數。
  例如:給定一個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(其中16進制數字爲0-9與A-F),求最少經過幾步可以得到迴文數。
  如果在30步以內(包含30步)不可能得到迴文數,則輸出“Impossible!”

輸入格式

  兩行,N與M

輸出格式

  如果能在30步以內得到迴文數,輸出“STEP=xx”(不含引號),其中xx是步數;否則輸出一行”Impossible!”(不含引號)

樣例輸入

9
87

樣例輸出

STEP=6

 

 

#include<iostream>
#include<cstring>
using namespace std;
int a[100],n,ans;//ans是步數,n是進制,數組儲存各位數 
void init(int a[])//輸入及轉化 
{
	string s;
	cin>>s;
	a[0]=s.length();
	for(int i=1;i<=a[0];i++)
		if(s[a[0]-i]>='0'&&s[a[0]-i]<='9')
			a[i]=s[a[0]-i]-'0';
		else
			a[i]=s[a[i]-i]-'A'+10;
}
bool check(int a[])//迴文數的判定,a[0]存的是長度 
{
	for(int i=1;i<=a[0]/2;i++)
		if(a[i]!=a[a[0]-i+1])
			return false;
	return true;
}
void jia(int a[])//相當於一個高精度加法 
{
	int b[100],i;
	for(int i=1;i<=a[0];i++)
		b[i]=a[a[0]-i+1];
	for(i=1;i<=a[0];i++)
	{
		a[i]+=b[i];
		a[i+1]+=a[i]/n;//n進制內除、模n 
		a[i]%=n;
	}
	if(a[i]!=0)
		a[0]++;
}
int main()
{
	cin>>n;
	init(a);
	while(ans<=30)//30步以內可得解 
	{
		if(check(a))
		{
			cout<<ans;
			return 0;
		} 
		ans++;
		jia(a);
	}
	cout<<"Impossible";
	return 0;
}

謹以此作爲本萌新的一次複習……

 

---------------幾個月以後又碰到了這題-------------我好像並沒有進步啊orz-------------

#include <bits/stdc++.h>
using namespace std;

int n, a[1005];

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

void add()
{
	int temp[1005]={0};
	int x = 0;
	for (int i = 1; i <= a[0]; i++)
	{
		temp[i] = a[i] + a[a[0]-i+1] + x;
		x = temp[i] / n;
		temp[i] %= n;
	}
	temp[0] = a[0];
	if (x)	temp[++temp[0]] = x;

	memcpy(a, temp, sizeof(a));
}

int solve()
{
	for (int i = 0; i <= 30; ++i)
	{
		if (yes())	return i;
		add();
	}
	return -1;
}

int main()
{
	string s;
	cin >> n >> s;

	a[0] = s.length();
	for (int i = 1; i <= a[0]; ++i)
	{
		a[i] = s[a[0]-i] - '0';
		if (n == 16 && isalpha(s[a[0]-i]))
			a[i] = s[a[0]-i] - 'A' + 10;
	}

	int flag = solve();
	if (flag >= 0)	printf("STEP=%d", flag);
	else	puts("Impossible!");
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章