您的位置:首页 > 其它

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

2016-03-05 22:35 323 查看
题目链接如下:点击打开链接

题目要求大概翻译如下:

从给定的两个数字比较是否相等,其中一个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;
}

谢谢大家支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息