11
2
2015
0

【noip1999】【高精度】【进制处理】回文数

好恶心的题!好恶心的题!好恶心的题!

没有一点难度我却调了一个小时

所以必须要发篇文章 哼

导致我调了一个小时的错误:

1、字符型数组转换为int要-'0',十六进制要-'A'+10

2、注意变量是否改变! 

a[i]+=tmp[i];
a[i+1]+=a[i]/n;//顺序!顺序!!!+=
a[i]=a[i]%n;
i++;

3、+=不要写成+或=
 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
//19:44-20:54 好辛酸.. 
char s[101]; 
int n,a[101],tmp[101];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void addd(int *a,int n)
{
	memset(tmp,0,sizeof(tmp));
	for(int i=1;i<=a[0];i++) tmp[i]=a[a[0]-i+1];
	int i=1;
	while(i<=a[0])
	{
		a[i]+=tmp[i];
		a[i+1]+=a[i]/n;//顺序!顺序!!!+= 
		a[i]=a[i]%n;
		i++;
	}
	if(a[i]>0) a[0]++;//i不加1 
}
bool judge(int *a)
{
	for(int i=1;i<=a[0];i++)
		{
			if(a[i]==a[a[0]-i+1]) continue;
			else return false;
		}
	return true;
}
int main()
{
	int n,len,cnt=0;
	n=read();
	gets(s);
	len=strlen(s);
	a[0]=len;
	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';//记住-'0'
		else a[i]=s[a[0]-i]-'A'+10;  
	if(judge(a)) {puts("0");return 0;}
	do{
	addd(a,n);
	cnt++;
	if(cnt>30) {puts("Impossible");return 0;}
	}while(!judge(a));
	printf("%d\n",cnt);
	return 0;	 
} 
Category: 高精度 | Tags: | Read Count: 498

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com