我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。
这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。
程序的输入是两个数字 M 和 N( 其十进制的值不超过 1000000000) ,它们的进制在 2~36 之间。对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。
求出分别在 2~36 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。当然了,对于多种可能成立的情况,找出符合要求的进制最小的一组就行了。信息的格式见测试用例。
| 测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 |
---|
测试用例 1 | 以文本方式显示
- 12?5?
| 以文本方式显示
- 12?(base?3)?=?5?(base?6)?
| 1秒 | 64M | 0 | 测试用例 2 | 以文本方式显示
- 123?456?
| 以文本方式显示
- 123?is?not?equal?to?456?in?any?base?2..36?
| 1秒 | 64M | 0 | 测试用例 3 | 以文本方式显示
- 10?A?
| 以文本方式显示
- 10?(base?10)?=?A?(base?11)?
| 1秒 | 64M | 0 | 测试用例 4 | 以文本方式显示
- 12???456?
| 以文本方式显示
- 12?is?not?equal?to?456?in?any?base?2..36?
| 1秒 | 64M | 0 |
分析:因为可能用到A~Z,所以用字符数组来保存输入的数据。? ?题目的要求是你输入的两个数据在某种进制下可以相等, 再结合用例我们可以想到公式:在某一个进制下,一个数据应为 各个位的数字 × (进制数的位数-1)次方 【sum = a[j] * pow (base,j-1)】,此外每一个数,他合法的最小进制转化应该是各个位最小的数再加1 例如10 最小进制转化为2? A最小进制转化为 11;
这里函数的指针完全可以转化为数组,只是为了好看~
#include <stdio.h>
#include <math.h>
#include <string.h>
char a[50], b[50];
int c[50], d[50];
int main() {
scanf("%s %s", a, b);
void basechange(char *a, int);
int startbase(char *x);
basechange(a, 1);
basechange(b, 2);
/* for (int i = startbase(a); i <= 36; i++) //调试用
printf("%d\n", c[i]);
printf("\n");
for (int i = startbase(b); i <= 36; i++)
printf("%d\n", d[i]);*/
for (int i = startbase(a); i <= 36; i++) {
for (int j = startbase(b); j <= 36; j++) {
if (c[i] == d[j]) {
printf("%s (base %d) = %s (base %d)\n", a, i, b, j);
return 0; //在这返回0 如果没有结束就意味着不存在
}
}
}
printf("%s is not equal to %s in any base 2..36\n", a, b);
}
void basechange(char *f, int x) { //函数一:将一个数所有合法进制转化并存下来
int sum = 0; //这里由于要对两个数据转化,因此抽象了一个参数x表示哪一个数
int startbase(char *x);
for (int i = startbase(f); i <= 36; i++) {
sum = 0;
for (int j = 0; j <= strlen(f) - 1; j++) {
char t = f[j];
if (t > 60) {
t -= 7;
}
t -= 48;
sum += t * pow(i, strlen(f) - 1 - j);
}
if (x == 1) //对应参数x
c[i] = sum;
if (x == 2)
d[i] = sum;
}
}
int startbase(char *x) { //函数2 找最小合法进制转化数
int max = *x;
for (int i = 0; i <= strlen(x) - 1; i++) {
if (max < * (x + i)) {
max = *(x + i);
}
}
if (max > 60)
max -= 7;
max -= '0';
max += 1;
return max;
}
main函数中只分了三小部分:输入数据,利用函数进行转化,判断是否有解。
if (x>60) x-=7; x-=48或x-='0'? ?可以将数字和字母都转化为int 类数字(0~9 ASCII码为48~57,A为65,A对应10,理论上应该是58,所以额外减去7)
|