当前位置: 首页 > news >正文

xtuoj Digit String

题目

思路

首先,我们需要将得到的字符串,按字符拆解,将字符转换为对应数字。

如何做呢?通常只需以字符串的形式读入,然后计算字符串的长度(int len=strlen(s)),这是为了看有多少位字符需要处理,接着我们用一个 for 循环遍历这些字符,如果是 '0' - '9' ,那么将字符的 '0' - '9',减去 '0',即可得到数字的0-9,如果是 'A' - ' F',那么减去 'A',会得到数字0-5,但是我们需要字符'A' - ' F',表示的是10-15,所以我们再原来减去 'A' 的同时再加上10,这样就把字符全部转换为对应的数字了。

题目要求我们找出最小的进制表示的字符串,使得对应的十进制等于 n,所以我们需要先找出最小能够表示我们字符串的进制,接着再去判断其对应的十进制下是否等于 n,如果不等,那我们进制就要增大。

k 进制下的每一位数字都满足 < k,如果有数字 >= k,那么该进制无法表示该字符串,所以我们只需要保证最大的数字 < k,即可保证所有数字都 < k,那么至少保证了该进制表示下是有效的。所以最小可能的进制为最大数字+1,因为进制肯定是整数。

接着,我们再去判断最小可能的进制下,对应的十进制是否等于 n,如果不等,那么该进制不是最小能够满足条件的进制,其实这里我们可以优化一下,因为计算对应的十进制是诸位进行的,那么当我们计算到某位的时候,表示的十进制已经超过了 n,那么该进制肯定不会等于 n 了,因为所有的数字非负,只会不减;那么我们继续增大最小进制,继续上述判断。所以这里我们肯定要采用两个标记变量,比如说 valid 和 found,valid 用来标记当前进制是否有效,found 用来判断是否存在某进制使得对应下的十进制等于 n。

现在还有个问题没有解决,那么就是如何将 k 进制转换为10进制。这里我们采用的方法是多项式法,就是比如 k 进制下是123,那么转换为十进制,就是3*k^0+2*k^1+1*k^2。

现在如果是手算我们解决了,但是代码怎么实现呢?我们刚开始处理的字符串是由高位到低位存到一个数字里面,比如说是字符串123,存到数组里面就是digit[]=[1,2,3],假设 value 就是我们转换到十进制后的值,先初始化为0,3*k^0+2*k^1+1*k^2 = 3+(2+(1+0*k)*k)*k,我们可以把计算式写成右边迭代的形式,就可以发现规律啦,我们先从内部算起,首先我们计算value*k+digit[0],接着我们把这个结果赋值给value,然后又是value*k+digit[1],还是赋值给value,接着计算value*k+digit[2],也就是说value=value*k+digit[i],我们从将 digit 遍历完后的结果value,也就是我们要求解的值。

以上就把所有问题解决啦,大家可以试试自己看着这个思路写写代码,可以先不看我的代码哟!

代码

#include <stdio.h>
#include <string.h>int main() {char str[32];int n;while (scanf("%s %d", str, &n) != EOF) {int len = strlen(str);int max_digit = 0;int digits[32];for (int i = 0; i < len; i++) {if (str[i] >= '0' && str[i] <= '9') {digits[i] = str[i] - '0';} else if (str[i] >= 'A' && str[i] <= 'F') {digits[i] = str[i] - 'A' + 10;}if (digits[i] > max_digit) {max_digit = digits[i];}}int min_base = (max_digit + 1) > 2 ? (max_digit + 1) : 2;if (min_base > 16) {printf("Impossible\n");continue;}int found = 0;for (int k = min_base; k <= 16; k++) {long long value = 0;int valid = 1;for (int i = 0; i < len; i++) {value = value * k + digits[i];if (value > n) {valid=0;break;}}if (valid && value == n) {printf("%d\n", k);found = 1;break;}}if (!found) {printf("Impossible\n");}}return 0;
}

代码二

稍微改了一下,可以思考为什么也是对的。

#include <stdio.h>
#include <string.h>int main() {char str[32];int n;while (scanf("%s %d", str, &n) != EOF) {int len = strlen(str);int max_digit = 0;int digits[32];for (int i = 0; i < len; i++) {if (str[i] >= '0' && str[i] <= '9') {digits[i] = str[i] - '0';} else if (str[i] >= 'A' && str[i] <= 'F') {digits[i] = str[i] - 'A' + 10;}if (digits[i] > max_digit) {max_digit = digits[i];}}int min_base = (max_digit + 1) > 2 ? (max_digit + 1) : 2;if (min_base > 16) {printf("Impossible\n");continue;}int found = 0;for (int k = min_base; k <= 16; k++) {long long value = 0;int valid = 1;for (int i = 0&&valid; i < len; i++) {value = value * k + digits[i];if (value > n) valid=0;}if (valid && value == n) {printf("%d\n", k);found = 1;break;}}if (!found) {printf("Impossible\n");}}return 0;
}

代码三

这个加了一部分,也改了一部分,同样可以去思考原因。

#include <stdio.h>
#include <string.h>int main() {char str[32];int n;while (scanf("%s %d", str, &n) != EOF) {int len = strlen(str);int max_digit = 0;int digits[32];for (int i = 0; i < len; i++) {if (str[i] >= '0' && str[i] <= '9') {digits[i] = str[i] - '0';} else if (str[i] >= 'A' && str[i] <= 'F') {digits[i] = str[i] - 'A' + 10;}if (digits[i] > max_digit) {max_digit = digits[i];}}int min_base = (max_digit + 1) > 2 ? (max_digit + 1) : 2;if (min_base > 16) {printf("Impossible\n");continue;}int found = 0;for (int k = min_base; k <= 16; k++) {long long value = 0;int valid = 1;for (int i = 0; i < len; i++) {if (digits[i] >= k) {valid = 0;break;}value = value * k + digits[i];if (value > n) {break;}}if (valid && value == n) {printf("%d\n", k);found = 1;break;}}if (!found) {printf("Impossible\n");}}return 0;
}
http://www.dtcms.com/a/549668.html

相关文章:

  • 【代码随想录算法训练营——Day53】图论——110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长
  • 【代码审计】ECShop_V4.1.19 SQL注入漏洞 分析
  • 桐城市住房和城乡建设局网站广东网广东网站建设
  • 网站后台与前台家具网站开发设计任务书与执行方案
  • 网站的文案物流的网站模板
  • ESP32在arduino环境下的离线安装 -- 理论上多个版本都有效
  • Windows的mklink创建符号链使用方法
  • 小清新网站风格正规接单赚佣金的平台
  • 应用APP开发程序编辑中的数据加密和解密以及签名使用解释技巧
  • Spring Boot3零基础教程,Function 各种写法,笔记97
  • 好文与笔记分享 A Survey of Context Engineering for Large Language Models(上)
  • 贵阳营销型网站建设wordpress用思源黑体
  • ksycopg2实战:Python连接KingbaseES数据库的完整指南
  • mediwiki 做网站做网站有发展吗
  • 如何做网站服务器映射计算机专业学做网站吗
  • 拟人AI GoCap:用机器学习打造真实玩家体验
  • cocos里UV坐标显示取值变化异常问题
  • 【Python】包管理神器-uv
  • 设计模式——抽象工厂方法(abstract factory)
  • 追剧狂人网页入口 - 免费影视在线观看网站
  • 以太网多参量传感器:工业物联网时代的安全监测革新
  • wordpress整站模板php 怎么做视频网站
  • Rust 内存对齐与缓存友好设计
  • 百度快照 直接进网站wordpress小工具缓存
  • 【英飞凌TC364】点亮LED灯
  • LeetCode 3346.执行操作后元素的最高频率 I:滑动窗口(正好适合本题数据,II再另某他法)
  • 【STM32】FLASH闪存
  • 东莞网站关键词推广义乌百度推广公司
  • Spring远程调用与Web服务全解析
  • 手机站喝茶影视茂名市建设银行网站