[NOIP1999]回文数

该博客介绍了如何解决NOIP1999竞赛中关于回文数的问题。通过按照指定步骤模拟运算,特别是针对16进制的特殊处理,将A-F转换为10-15的形式,确保了计算的准确性。文中提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据提示,我们可以按照指定的步骤模拟运算即可,唯一需要注意的是对于16进制的处理,这里把相应的A~F全部化为10+‘0’,11+‘0’。。。。等形式(不会影响运算的正确性)。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int maxn = 100 ;

char numa[maxn] ;
int  numb[maxn] ;
int  n ;
int  m ;

bool Is_Par();
void work()  ;
void cacu()  ;

int main()
{
	work()   ;
    return 0 ;
}

void work()
{
	scanf("%d\n%s" , &n , numa) ;

	if(n==16)
	{
		for(int i = 0 ; i < strlen(numa) ; i ++)
		{
			if(numa[i]=='A'||numa[i]=='B'||numa[i]=='C'||numa[i]=='D'||numa[i]=='E'||numa[i]=='F')
			{
				numa[i] = numa[i] - 'A' + 10  + '0' ;
			}
		}
	}

	m = 0 ;

	while(!Is_Par() && m <= 30)
	{
		cacu() ;
		m ++ ;
	}

	if(m<=30)
		printf("%d\n" , m) ;
	else
		printf("Impossible\n") ;
}

bool Is_Par()
{
	int i ;
	int len ;

	len = strlen(numa) ;
	i = 0 ;

	while(i < len/2)
	{
		if(numa[i] != numa[len - i -1])
			return 0 ;

		i ++ ;
	}

	return 1 ;
}

void cacu()
{
	int len ;
	int i ;
	int j ;

	len = strlen(numa) ;

	for(i = len - 1 ; i >= 0 ; i --)
	{
		numb[i] = (numa[i] - '0') + (numa[len - i - 1] - '0') ;
	}

	j = 0 ;

	for(i = 0 ; i < len ; i ++)
	{
		numb[i+1] += numb[i] / n ;
		numb[i] = numb[i]%n ;
	}
	bool first = 0 ;

	j = 0 ;

	for( ; i >= 0 ; i--)
	{
		if(first)
		{
			numa[j] = numb[i] + '0' ;
			j ++ ;
		}
		else if(numb[i] != 0)
		{
			numa[j] = numb[i] + '0' ;
			j++ ;
			first = 1 ;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值