初学高精度复习一道老题——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!");
}

 

 

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