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

来源:互联网 发布:淘宝质量好的男鞋店 编辑:程序博客网 时间:2024/05/29 14:36

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

题目要求大概翻译如下:

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

谢谢大家支持!


1 0
原创粉丝点击