马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 有问题?
您的代码看上去是没有问题的,但有一点可能被忽略了,那就是在输出数字的顺序。在您的代码中,您使用了递归的方式来进行进制转换,然后直接输出结果。这导致数字的顺序实际上是颠倒的。
这个问题可以通过采用一个辅助栈(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;
}
这样修改后的代码将保证在进行进制转换的时候输出的数字顺序是正确的,从而解决您遇到的问题。
|