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

xtuoj 2021

题目

思路

这题的思路和前面写的xtuoj Digit String-CSDN博客的思路差不多,只是这里要注意一下要分析这个进制的上界。

上界的分析:当这个数字串只有一位有效数字num时(有效数字就是把前导0去掉剩下的那些数字),必然不可能等于2021,因为最后一位是num*b^0,也就是num,num在0~9之间,所以不可能等于2021;当这个数有两位有效数字时,此时对应的是进制的上界,为10时取得,因为有效数字位数越多,进制在较小时即能实现,此时0*b^0+1*b^1=b,必须使得b<=2021,为什么还要有 <,因为我们之前设的是10,是较小的数,要是取大一点,那么b就取小一点也能满足。

思路一:首先还是要把字符转换为数字(-'0'),然后我们判定最小可能的b进制的取值(要在某b进制下能够表示该数字串,必然要求所有的数字都要<b,那么我们只需使得最大数字<b即可,则最小可能的b进制的取值是max+1,但是如果max+1比2小,那么我们还是要将其设置为2进制,因为b不小于2),直接按照多项式法则,将b进制转换为10进制(对应数字乘以对应权重再相加),从最小可能的b进制开始,到b的上界2021,逐个进制判定是否成立,因为我们是要找最小的进制,所以要从小到大,然后在代码里面,转换为十进制的方法就是,value=value*i+digit[j],这是核心代码,注意此处的digit数组,存的是由高位到低位的,如果逐个数字处理过程中,当前转换为十进制的值已经超过了2021,那么就不可能==2021了,因为后面只会不减,然后遍历完所有数字以后,我们再判断转换为十进制后的value是不是等于2021,如果是就找到了。

思路二:由于思路一讲的很清楚了,所以这里我就将核心步骤,代码里面我添加了注释。首先去掉前导0(为了避免很多没必要的计算,因为0可以直接不算,+0和不加0效果一致);然后提取有效数位数组;提前判断特殊情况数位为1和全是0的情况,直接输出0;寻找最小可能的进制的下界;判断b进制转十进制后是否为2021。

技巧(优化)

1、去掉前导0

2、找到最小可能的b进制

3、一位有效数字和全0直接判断

4、处理到某个数后发现>2021提前终止

注意点

1、一定要写b的上界

2、value要设置为long long

代码一

#include<stdio.h>
#include<string.h>
#define ll long longint len,max,b,valid,found;
char s[105];
int digit[105];
ll value;void num_2021(char *s){len=strlen(s);max=0;for(int i=0;i<len;i++){digit[i]=s[i]-'0';if(digit[i]>max) max=digit[i];}b=(max+1)>2?(max+1):2;found=0;for(int i=b;i<=2021;i++){valid=1,value=0;for(int j=0;j<len;j++){value=value*i+digit[j];if(value>2021){valid=0;break;}}if(valid&&value==2021){found=1;printf("%d\n",i);break;}}if(!found) printf("0\n");
}int main(){while(~scanf("%s",s)){num_2021(s);}return 0;
}

代码二

#include <stdio.h>
#include <string.h>int main() {char s[105];while (scanf("%s", s) != EOF) {int len = strlen(s);int start = 0;while (start < len && s[start] == '0') {start++;	//统计前导0的个数}if (start == len) {printf("0\n");	//全是0,不可能等于2021continue;}char t[105];int L = 0;for (int i = start; i < len; i++) {t[L++] = s[i];	//有效数位数组}t[L] = '\0';int max_digit = 0;for (int i = 0; i < L; i++) {int digit = t[i] - '0';if (digit > max_digit) {max_digit = digit;}}int b_min = (max_digit + 1)>2?(max_digit + 1):2;if (L == 1) {printf("0\n");	//一位有效数字不可能表示2021continue;}int found = 0;int ans = 0;for (int b = b_min; b <= 2021; b++) {long long value = 0;for (int i = 0; i < L; i++) {value = value * b + (t[i] - '0');if (value > 2021) {	//提前终止break;}}if (value == 2021) {	//遍历完所有数字后才能判断是否等于2021found = 1;ans = b;break;}}if (found) {printf("%d\n", ans);} else {printf("0\n");}}return 0;
}

代码三

#include<stdio.h>
#include<string.h>
#define ll long longchar s[105];void num_2021(char *s) {int len = strlen(s);// 处理前导零int start = 0;while (start < len && s[start] == '0') {start++;}// 如果全为零或只有一位数字,直接返回0if (start == len || len - start == 1) {printf("0\n");return;}// 提取有效数字部分int effective_len = len - start;int digit[105];int max_digit = 0;for (int i = 0; i < effective_len; i++) {digit[i] = s[start + i] - '0';if (digit[i] > max_digit) {max_digit = digit[i];}}// 确定最小进制int b_min = (max_digit + 1 > 2) ? (max_digit + 1) : 2;int found = 0;// 搜索合适的进制for (int b = b_min; b <= 2021; b++) {ll value = 0;int valid = 1;for (int j = 0; j < effective_len; j++) {value = value * b + digit[j];if (value > 2021) {valid = 0;break;}}if (valid && value == 2021) {found = 1;printf("%d\n", b);break;}}if (!found) {printf("0\n");}
}int main() {while (~scanf("%s", s)) {num_2021(s);}return 0;
}

http://www.dtcms.com/a/561049.html

相关文章:

  • 数据科学每日总结--Day8--数据挖掘
  • 达梦DEM监控工具部署
  • 机器学习实践项目(二)- 房价预测 - 认识数据
  • 李宁运动服网站建设规划书网站内链少改怎么做
  • 安装JDK安装GIT安装IDEA
  • 定制报表系统设计与实现
  • 最具价值的网站建设商业策划公司十大公司
  • 网站开发设计公东莞智通人才招聘网官网
  • 【BFS 解决FloodFill 算法】3. 岛屿的最⼤⾯积(medium)
  • 【JUnit实战3_23】 第十四章:JUnit 5 扩展模型(Extension API)实战(上)
  • python_study--week3
  • 【Excalidraw】简洁好看的超轻量级画图白板
  • 手写Autosar架构的CAN通讯协议栈2(CanIf模块详解-上)
  • 【Agentic RL 专题】三、深入浅出强化学习算法 TRPO 和PPO
  • 中国最好的建站公司毕业设计模板
  • 《算法通关指南:数据结构和算法篇 --- 栈相关算法题》--- 1. 【模板】栈,2.有效的括号
  • 高效管理搜索历史:Vue持久化实践
  • html网站架设目录和文章wordpress
  • Rust 编程语言基础知识全面介绍
  • 洛龙区网站制作建设费用做网站一般用什么语言
  • 计算机网络---基础诊断ping
  • 13.2.2.Nginx
  • java后端学习经验分享(大三进大厂版)
  • 好用的镜像源
  • 做网站的经验有什么好的加盟店项目
  • linux-shell-基础与变量和运算符-1
  • 论文解读:Sleeping with One Eye Open: Fast, Sustainable Storage with Sandman
  • 手机客户端网站建设腾讯云服务器免费领取
  • Gorm(十三)主从表的判断
  • 从零开始的云原生之旅(十):HPA 完全指南:从原理到实践