PAT程序能力考题——甲级1010(比较任意进制转换的两个数字,是否相等)

题目链接如下:点击打开链接

题目要求大概翻译如下:

从给定的两个数字比较是否相等,其中一个N1给出进制radix(如果tag为1,则是N1,为2,则是N2),检验另一个数字N2(N1)在2—36进制中任意一种情况下是否与N1(N2)相等,如果相等,输出进制,不相等,输出‘impossible’

举例输入:

6 110 1 10

则输出为

2

程序设计如下:

// pat 甲级1010,比较两个任意数字(转化为2--36进制都可)
#include <stdio.h>
#include <math.h>
#include <string.h>

char n1[10] = {0};
char n2[10] = {0};
int tag = 0;
int radix = 0;
int specRadix = 0;

//把特定的数字从原来的进制转化成十进制数
unsigned long convertDigitToDecimal( char* rawDigit , int rawRadix )
{
	unsigned long number = 0;
	int middle = 0;
	if ( rawRadix < 2 || rawRadix > 36 )
	{
		return 0;
	}
	// 将字符中的数字信息reverse,方便计算
	middle = strlen(rawDigit) / 2;
	for ( int i = 0; i < middle; i++ )
	{
		char tmp = rawDigit[ strlen(rawDigit) - i - 1];
		rawDigit[ strlen(rawDigit) - i - 1 ] = rawDigit[i];
		rawDigit[i] = tmp;
	}

	// 从低位到高位累加结果
	for ( int i = 0; i < strlen(rawDigit); i++ )
	{
		char tmp = rawDigit[i];
		int newNumber = (  47 < tmp && tmp < 58 ? tmp - 48 : (tmp - 'a')+ 10 );
		int expo =  (int)pow((float)rawRadix, i);
		number += expo* newNumber;
	}
	return number;
}
// 比较两个数字
int compare( char* n1, char* n2, int tag, int radix )
{
	unsigned long number1 = ( tag == 1 ? convertDigitToDecimal( n1, radix ) : convertDigitToDecimal( n2, radix ) );
	unsigned long number2 = 0;
	int minRadix = 0;
	char* number = ( tag == 1 ? n2 : n1 );
	//计算出另外这个数应该用的最小进制
	for ( int k = 0; k < strlen(number); k++ )
	{
		char curDigit = number[k];
		if ( curDigit > 47 && curDigit < 58 )
		{
			curDigit = curDigit - 48;
		}
		else
		{
			curDigit = curDigit - 'a' + 10;
		}
		if ( minRadix < curDigit )
		{
			minRadix = curDigit;
		}
	}
	// 从可用最小进制遍历到36进制,逐个验证
	for( int i = ( minRadix < 2 ? 2: minRadix +1 ); i < 37;  i++ )
	{
		number2 = ( tag == 1 ? convertDigitToDecimal( n2, i ) : convertDigitToDecimal( n1, i ) );
		if ( number2 == number1 )
		{
			specRadix = i;
			return true;
		}
	}
	return false;
}

/**
* sample input format:
* n1 n2 tag radix
*/
int main()
{
	char* head = NULL, *tail = NULL;
	char input[100] = {0};
	printf( "Please input the n1 n2 tag radix:\n");
	scanf( "%[^\n]", input );

	tail = head = input;
	while( *tail != ' ' )
		tail++;
	strncpy( n1, head, tail - head );
	head = ++tail;
	while( *tail != ' ' )
		tail++;
	strncpy( n2, head, tail - head );

	sscanf( tail, "%d %d", &tag, &radix );
	if ( compare(n1, n2, tag, radix) )
	{
		printf( "%d\n", specRadix );
	}
	else
	{
		printf("impossible\n");
	}
	return 1;
}

谢谢大家支持!


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值