🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
1.1 输入描述
1.2 输出描述
1.3 测试样例
1.3.1 示例 1
1.3.2 示例 2
1.3.3 示例 3
二、解题思路
三、代码实现
四、时间复杂度
一、题目描述
集团员工人数突破 20 亿人,即将遇到工号不够用的情况。现在设计新的工号系统,新的工号系统由小写英文字母(a-z)和数字(0-9)两部分组成。新工号由一段英文字母开头,之后跟随一段数字,比如:“aaahw0001”, “a12345”,“abcd1”,“a00”。注意,新工号不能全部为字母或者数字,允许数字部分有前导0或者全为0。现在给出新工号至少需要分配的人数 X 和新工号中字母的长度 Y,求新工号中数字的最短长度 Z。
1.1 输入描述
一行包含两个非负整数 X Y, 它们用单个空格分割。其中:
0 < X <= 2^50 - 1
0 < Y <= 5
1.2 输出描述
输出新工号中数字的最短长度 Z。
1.3 测试样例
1.3.1 示例 1
输入
260 1
输出
1
说明:由于字母长度为 1,从 26 个字母中选择一个字母的组合数为 26。0-9 这10个数字中,任选一个数字的组合数量为 10,26 * 10 == 260,因此最短数字长度为 1。
1.3.2 示例 2
输入
26 1
输出
1
说明:其实 26 个人只需要 26 个字母就够了,但是由于数字是必须的,所以至少需要 1 个数字。
1.3.3 示例 3
输入
2600 1
输出
2
说明:同上。
二、解题思路
本题属于简单题,假设字母长度为 Y,那么,组合后就有 26^Y 种可能,注意:数字最少一个。数字每一位有 10 中可能,假设 Z 表示数字的个数,总的数量 sum = 26^Y * 10^Z。
三、代码实现
代码实现如下所示。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long x, y;
while (cin>>x>>y) {
long long sum = (long long )pow(26, y);
int num = 0;
if (sum >= x) {
num = 1;
} else {
while (sum < x) {
sum *= 10;
num++;
}
}
cout<<num<<endl;
}
return 0;
}
四、时间复杂度
时间复杂度:O(1)
在上述代码中,可以通过计算得到所需数字的最短长度,故时间复杂度约为 O(1)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞