【小码匠自习室】double的坑好深:ABC185 - C - abc285_brutmhyhiizp

2023-03-06 14:34:50 浏览数 (1)

诡异

3个示例都通过了,可提交上去,有3个case没过,搞的我一头雾水,有些懵圈。

老码农让我又加测了几个case,让我注意边界值,我测了机组,都没有问题啊。

往往这个时候,老码农同学就该操刀上场了。他的经典台词:姜是老的辣,看我的。

果然不服还是不行,他劈里啪啦测试了几组数据,就测出bug了。

题目的示例数据

代码语言:javascript复制
BRUTMHYHIIZP

输出结果是

代码语言:javascript复制
10000000000000000

他测试时输入

代码语言:javascript复制
BRUTMHYHIIZQ

而输出结果,还是

代码语言:javascript复制
10000000000000000

肯定是不对的,我扫了下代码,判断应该是pow函数搞的鬼,那我就不用你了。

详细看后面的代码。

补充知识点

且看,pow函数的参数

代码语言:javascript复制
pow(double _X, double _Y)

pow函数的输入和输出都是double,肯定是精度出问题了。此时,可以考虑用快速幂来解决精度问题

知识点

  • 快速幂
    • https://oi-wiki.org/math/binary-exponentiation/

题目

在另一个世界的AtCoder上举办的AtCoder Big Contest将一次性出现

10^{16}

问题。

问题的ID从第一个问题开始依次为AB,…,Z, AA, AB, ..., ZZ, AAA, ... 来定义自定义外观。

也就是说,ID是按照以下顺序附加的。

  • 按字典顺序排列长度为1的大写字母字符串
  • 按字典顺序排列长度为2的大写字母字符串
  • 按字典顺序排列长度为3的大写字母字符串
  • ......

这个竞赛包含的问题的ID的字符串S被给予,请回答那个是第几个问题。

制約
  • S作为AtCoder Big Contest中包含的问题的ID是正确的

入力
代码语言:javascript复制
S
出力

把答案作为整数输出。


入力例 1
代码语言:javascript复制
AB
出力例 1
代码语言:javascript复制
28

ID为AB的问题是AtCoder Big Contest的第28个问题。


入力例 2
代码语言:javascript复制
C
出力例 2
代码语言:javascript复制
3

ID为C的问题是AtCoder Big Contest的第三个问题。


入力例 3
代码语言:javascript复制
BRUTMHYHIIZP
出力例 3
代码语言:javascript复制
10000000000000000

ID为BRUTMHYHIIZP的问题是AtCoder Big Contest的

10^{16}

问题,即最终问题。

小码匠

代码
  • AC
代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;
#define endl 'n';
 
void best_coder() {
    string s;
    cin >> s;
    unsigned long long ans = 0;
    int j = 0;
    for (int i = s.size() - 1; i >= 0; --i) {
        long long p = 1;
        for (int j = 0; j < i;   j) {
            p *= 26;
        }
        ans  = (s[j] - 'A'   1) * p;
          j;
    }
    cout << ans;
}
 
void happy_coder() {
}
 
int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
 
    // 小码匠
    best_coder();
 
    // 最优解
    // happy_coder();
 
    // 返回
    return 0;
}

AC: 47 WA: 3

代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;
#define endl 'n';
 
void best_coder() {
    string s;
    cin >> s;
    long long ans = 0;
    long long j = 0;
    for (long long i = s.size() - 1; i >= 0; --i) {
        ans  = (s[j] - 'A'   1) * pow(26, i);
          j;
    }
    cout << ans;
}
 
void happy_coder() {
}
 
int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
 
    // 小码匠
    best_coder();
 
    // 最优解
    // happy_coder();
 
    // 返回
    return 0;
}

0 人点赞