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;
}
谢谢大家支持!
题目要求大概翻译如下:
从给定的两个数字比较是否相等,其中一个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;
}
谢谢大家支持!
相关文章推荐
- PAT程序设计练习——甲级1001(标准格式化数字)
- PAT程序设计练习——甲级1002(两个多项式的解析与合并)
- PAT程序设计练习——甲级1003(任意两个城市最短距离、Floyd最短路径算法)
- PAT程序设计考题——甲级1004 遍历树节点(计算树每层的叶子节点数目)
- PAT程序设计考题——甲级1005 数字按位累加(非负数字按位累加和转化成对应英文单词)
- PAT程序设计考题——甲级1006 签到问题(求所有签到人的最早时间和最晚时间)
- PAT程序设计考题——甲级1007 (最大连续子序列和)
- PAT程序设计考题——甲级1008(Elevator电梯时间计算问题)
- PAT程序设计考题——甲级1009(计算两个多项式相乘的积)
- 数字进制转换
- 制作启动U盘
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- 文章标题
- #if和if的区别以及#pragma、unused
- 天灵灵,地灵灵,但愿这个一定灵!!!python调用win32api,启动应用程序窗口
- synopsys license maker
- Eviews 8.0&9.0界面新功能介绍
- HashMap深度解析(二)
- 集合类学习之Arraylist 源码分析
- sh运算符