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

P1112 波浪数 题解

题目描述

波浪数是在一对不同数字之间交替转换的数,如 \(1212121\),双重波浪数则是指在两种进制下都是波浪数的数,如十进制数 \(191919\) 是一个十进制下的波浪数,它对应的十一进制数 \(121212\) 也是一个波浪数,所以十进制数 \(191919\) 是一个双重波浪数。特别地,只有一位的数也算作波浪数,例如 \(1\)。类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如 \(300_{(10)}=606_{(7)}=363_{(9)}=454_{(8)}=1\mathtt{A}1_{(13)}\),下标表示采用的进制。你的任务就是在指定范围内找出双重、三重、四重波浪数。

输入格式

单独一行包含五个用空格隔开的十进制整数 \(l, r, L, R, k\)\([l, r]\) 表示应当考虑的进制的范围,\([L,R]\) 表示应当考虑的数字的范围,\(k\) 表示你应该找的波浪数的重数。

输出格式

从小到大以十进制形式输出指定范围内的指定重数的波浪数。一行输出一个数。

数据范围及约定

对于全部数据,保证 \(2\le l\le r\le 32\)\(1\le L\le R\le 10^7\)\(k\in \{2, 3, 4\}\)


解析

首先,首先理解题意:任意一个波浪数 \(W\) 中第 \(x\) 位的数字 \(W_x\) 满足条件:

\[\text{check}(x) = \begin{cases} \text{return if } W_x \neq W_{x-1}\space(W.\text{size}() \geq 3)\\ \text{return if } W_x \neq W_{x+1}\space∧\space W_x = W_{x+2}\space(W.\text{size}() = 2)\\ \text{return true}\space(W.\text{size}() = 1)\\ \end{cases}\]

我们考虑模拟进制转换的过程,产生转换后的数字字符串,再对其进行判断数据。

\(82\text{ pts}\) 做法:转换字符串

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int l, r, L, R, k, cnt;bool check(int t, int b){int T = t;string res = "";while(T){ // 模拟进制转换int r = T % b; // 余数char c;T /= b;if(r >= 10) c = 'A' + r - 10; // 转化为字符else c = r + '0';res += c;}reverse(res.begin(), res.end()); // 由于处理使用最小到最大位处理,所以要反转字符串if(res.size() < 2) return true; else if(res.size() == 2 && res[0] != res[1]) return true;else if(res[0] == res[1]) return false;else{for(int i=2; i<res.size(); ++i) // 枚举每一位查看是否与波浪数的定义不一样if(res[i-2] != res[i])return false;return true;}
}int main(void){cin >> l >> r >> L >> R >> k;for(int num=L; num<=R; ++num){ // 枚举范围 [l, r] 之内的数字cnt=0;for(int base=l; base<=r; ++base) // 枚举范围 [L, R] 之内的基数if(check(num, base)) // 检查cnt++;if(cnt == k){cout << num << endl;}}return 0;
}

\(100\text{ pts}\) 做法

不转换进制,而是在转换时判断字符 \(W_i\) 和之前的 \(W_{i-2}\) 是否相等。

#include <iostream>
...
inline int read();
inline void write(int x);bool check(int t, int b){if(t < b) return true;char w[2] = {};// 取出两个字符w[0] = t % b; t /= b;w[1] = t % b; t /= b;if(w[0] == w[1]) // W.size() = 2 时判断return false;int f = 0;while(t){if(w[f] != t % b) // 如果不和前面的前面的字符相同return false;t /= b;f ^= 1; // 转换索引,即 f=(f==1)?0:1;}return true;
}int main(void){......
}

return 0;

http://www.hskmm.com/?act=detail&tid=29385

相关文章:

  • 20232411 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • 使用 Pascal 实现英文数字验证码识别系统
  • PWN手的成长之路-15-jarvisoj_level2_x64
  • 2025.10.12——1绿
  • 价值博弈场的工程实现:构建数字文明的价值免疫系统——声明Ai生成
  • 基于 Rust 的英文数字验证码识别系统设计与实现
  • 2025年两联供室内机厂家最新权威推荐榜:技术实力与市场口碑
  • 2025武汉商铺装修防水厂家最新权威推荐榜:专业施工与品质保
  • 2025铝合金微弧氧化厂家权威推荐榜:表面处理技术实力深度解
  • 2025杉木木方厂家最新权威推荐榜:优质木材与稳定供应口碑之
  • 2025年厂房保养厂家最新权威推荐榜:专业维护与成本控制优选
  • 使用C语言实现重写stm32的启动文件
  • 2025中医师承权威推荐榜:名师带徒与临床实践深度解析
  • 让我们开始 CSS 的学习之旅
  • 2025液压无损扒胎机厂家权威推荐榜:高效无损与耐用性能深度
  • Linux环境下的UDEV机制及其与守护进程的关联
  • 在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
  • [转] 基于ubuntu-base进行根文件系统的修改与打包
  • jquery 字符串转数字
  • AI圈每日技术学习---紧跟时代脚步(N8n工作流)
  • B -识别浮点常量问题
  • 小C语言--词法分析程序-A
  • 查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
  • 2025宿舍上下床厂家权威推荐榜:耐用设计与空间优化口碑之选
  • 梳理一下Java中为保证线程安全提供了那些方案 - 浪矢
  • 处理Git错误:“invalid object [hash]”和“unable to read tree [hash]”
  • 2025厂房恒温恒湿设备厂家权威推荐榜:精准控温与节能技术深
  • 面向对象编程实验一
  • ABC 427 EF
  • SHA256文件完整性校验