鱼C论坛

 找回密码
 立即注册
查看: 1043|回复: 11

[已解决]进制转换写挂的蒟蒻来问一下。

[复制链接]
发表于 2023-7-22 10:52:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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 了,怎么会错呢
#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 超过了

或者,如果这个代码真的没有什么问题,那么会不会是 zsy 的 std 有问题?
最佳答案
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;
}

这样修改后的代码将保证在进行进制转换的时候输出的数字顺序是正确的,从而解决您遇到的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}

这样修改后的代码将保证在进行进制转换的时候输出的数字顺序是正确的,从而解决您遇到的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

虽然我知道您可能不会二次回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 10:56:54 | 显示全部楼层
Mike_python小 发表于 2023-7-22 10:56
请将 /**********Program**********/ 和 /**********  End  **********/ 之间的部分替换为以下代码:

无意义回帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有可能但不多……最佳给别人吧(光速逃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 11:02:36 | 显示全部楼层
zhangjinxuan 发表于 2023-7-22 11:00
有可能但不多……最佳给别人吧(光速逃

???啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 11:05:51 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-22 11:06:31 | 显示全部楼层
没有注释,连参数都没有说明啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 12:59:57 | 显示全部楼层
你这个会输出字母吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 13:00:27 | 显示全部楼层
sfqxx 发表于 2023-7-22 12:59
你这个会输出字母吗?

找到原因了:

原因:std 有误,没有刷新缓存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 13:01:49 | 显示全部楼层
zhangjinxuan 发表于 2023-7-22 13:00
找到原因了:

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

??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 13:10:04 | 显示全部楼层
脸丢大了,被 sfqxx 超过了


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表