zhangjinxuan 发表于 2023-7-22 10:52:28

进制转换写挂的蒟蒻来问一下。

本帖最后由 zhangjinxuan 于 2023-8-20 20:55 编辑

题目(虽然是U题):https://www.luogu.com.cn/contest/118197#problems 比赛中的 https://www.luogu.com.cn/problem/U314594?contestId=118197 题目。

题面:

输入A,B;输出它们的和C

但本次需要输出结果的:

二进制、八进制、十进制、十六进制

数据范围在 long long内

我这可是祖传的进制转换,祖先用这个打了好几场 OI 了,怎么会错呢{:10_277:}

#include <bits/stdc++.h>
using namespace std;

long long a, b;
void c(long long i, int base, int first = 1) {
        if (i < 0) {
                putchar('-');
                c(-i, base, 0);
                return;
        }
        if (first && i == 0) {
                puts("0");
                return;
        }
        if (i == 0) return;
        c(i / base, base, 0);
        if (i % base >= 10) putchar(i % base - 10 + 'a');
        else putchar(i % base + '0');
}

int main() {
        scanf("%lld%lld", &a, &b);
        c(a+b,2); puts("");
        c(a+b,8); puts("");
        c(a+b,10); puts("");
        c(a+b,16); puts("");
        return 0;
}

脸丢大了,被 sfqxx 超过了{:9_240:}

或者,如果这个代码真的没有什么问题,那么会不会是 zsy 的 std 有问题?

isdkz 发表于 2023-7-22 10:52:49

您的代码看上去是没有问题的,但有一点可能被忽略了,那就是在输出数字的顺序。在您的代码中,您使用了递归的方式来进行进制转换,然后直接输出结果。这导致数字的顺序实际上是颠倒的。

这个问题可以通过采用一个辅助栈(Stack)来解决,将每一次的转换结果先存入栈中,然后再从栈中取出来进行输出,这样就能保证输出的数字顺序是正确的。具体的修改如下:

#include <bits/stdc++.h>
using namespace std;

long long a, b;
stack<int> s;// 用于存储每次的转换结果

void c(long long i, int base, int first = 1) {
    if (i < 0) {
      putchar('-');
      c(-i, base, 0);
      return;
    }
    if (first && i == 0) {
      puts("0");
      return;
    }
    if (i == 0) {
      while(!s.empty()) {
            int t = s.top();
            s.pop();
            if (t >= 10) putchar(t - 10 + 'A');
            else putchar(t + '0');
      }
      return;
    }
    s.push(i % base);
    c(i / base, base, 0);
}

int main() {
    scanf("%lld%lld", &a, &b);
    c(a+b,2); puts("");
    c(a+b,8); puts("");
    c(a+b,10); puts("");
    c(a+b,16); puts("");
    return 0;
}


这样修改后的代码将保证在进行进制转换的时候输出的数字顺序是正确的,从而解决您遇到的问题。

zhangjinxuan 发表于 2023-7-22 10:54:48

isdkz 发表于 2023-7-22 10:52
您的代码看上去是没有问题的,但有一点可能被忽略了,那就是在输出数字的顺序。在您的代码中,您使用了递归 ...

你看清楚了,我是先递归,再输出的。

虽然我知道您可能不会二次回复{:10_282:}

zhangjinxuan 发表于 2023-7-22 10:56:54

Mike_python小 发表于 2023-7-22 10:56
请将 /**********Program**********/ 和 /**********End**********/ 之间的部分替换为以下代码:




无意义回帖{:10_249:}

zhangjinxuan 发表于 2023-7-22 11:00:42

陶远航 发表于 2023-7-22 10:53
根据你提供的代码,我看到这是一个简单的进制转换程序。它接受两个整数 A 和 B,计算它们的和 C,并将和按 ...

有可能但不多……最佳给别人吧(光速逃

陶远航 发表于 2023-7-22 11:02:36

zhangjinxuan 发表于 2023-7-22 11:00
有可能但不多……最佳给别人吧(光速逃

???啊?

Ewan-Ahiouy 发表于 2023-7-22 11:05:51

看看

Ewan-Ahiouy 发表于 2023-7-22 11:06:31

没有注释,连参数都没有说明啊{:10_284:}

sfqxx 发表于 2023-7-22 12:59:57

你这个会输出字母吗?

zhangjinxuan 发表于 2023-7-22 13:00:27

sfqxx 发表于 2023-7-22 12:59
你这个会输出字母吗?

找到原因了:

原因:std 有误,没有刷新缓存。

sfqxx 发表于 2023-7-22 13:01:49

zhangjinxuan 发表于 2023-7-22 13:00
找到原因了:

原因:std 有误,没有刷新缓存。

??

sfqxx 发表于 2023-7-22 13:10:04

脸丢大了,被 sfqxx 超过了

{:10_249:}
页: [1]
查看完整版本: 进制转换写挂的蒟蒻来问一下。