XTU OJ 1353 Digit String

文章讲述了如何解决一个编程问题,给定包含0-9和A-F字符的密码片段,判断在哪个2到16进制下,其对应的十进制整数值等于给定的n。程序需找出最小满足条件的进制,若无解输出Impossible。
摘要由CSDN通过智能技术生成

题目描述

小明获得了一些密码的片段,包含0∼9,A∼F 这些字符,他猜这些是某个进制下的一个整数的数码串。 小明想知道从2到16进制中,哪些进制下,这个数码串的对应的十进制整数值,等于n?

输入

存在不超过1000个样例,每行一个样例。 每行包括两部分,数码串(串长不超过31),整数n(1≤n≤109)

输出

每行输出一个样例的结果。 如果存在多个解,输出最小的那个进制。 如果没有满足的进制,输出"Impossible"。

样例输入

F 15
F 14
23 11
25 13

样例输出

16
Impossible
4
Impossible

又是一次样例都过,结果WA的测试题,最后发现是第25行sum=0的问题

AC代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
	char str[110];
	__int64 n;
	while (scanf("%s %I64d", str, &n) != EOF) {

		int arr[1010] = {0};
		int len = strlen(str);

		int max = 0;
		for (int i = 0; i < len; i++) {//将字符串转化成数值
			if (str[i] >= 'A' && str[i] <= 'F') {
				arr[i] = str[i] - 'A' + 10;
			}
			if (str[i] >= '0' && str[i] <= '9') {
				arr[i] = str[i] - '0';
			}
		}

		__int64 sum, temp;
		__int64 flag = 0;
		for (__int64 i = max + 1; i <= 16; i++) {
			sum = 0;
			for (__int64 j = 0; j < len; j++) {
				if (arr[j] >= i) break; //如果arr[]中的值大于进制数,则不存在该转换
				sum = sum * i + arr[j];
			}

			if (sum == n) {
				flag = 1;
				temp = i;
				break;
			}
		}
		
		if (flag == 1) printf("%I64d\n", temp);
		else  printf("Impossible\n");
	}
	return 0;
}

测试时的代码:(WA)

#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
	char str[110];
	__int64 n;
	while (scanf("%s %I64d", str, &n) != EOF) {

		int arr[1010] = {0};
		int len = strlen(str);

		int max = 0;
		for (int i = 0; i < len; i++) {
			if (str[i] >= 'A' && str[i] <= 'F') {
				arr[i] = str[i] - 'A' + 10;
			}
			if (str[i] >= '0' && str[i] <= '9') {
				arr[i] = str[i] - '0';
			}
		}

		__int64 sum, temp;
		__int64 flag = 0;
		for (__int64 i = max + 1; i <= 16; i++) {
			sum=arr[0];    
			for (__int64 j = 1; j < len; j++) {
				if (arr[j] >= i) break;//测试时这样写没把arr[0]与进制数进行比较,考虑不全面;
				sum = sum * i + arr[j];
			}

			if (sum == n) {
				flag = 1;
				temp = i;
				break;
			}
		}
		
		if (flag == 1) printf("%I64d\n", temp);
		else  printf("Impossible\n");
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值