0
点赞
收藏
分享

微信扫一扫

(负)进制转换 (牛客)


(负)进制转换

  • ​​1.题目​​
  • ​​nk​​
  • ​​lg​​
  • ​​2.分析​​
  • ​​3.代码​​
  • ​​nk​​
  • ​​lg​​
  • ​​4.总结​​
  • ​​5.更新日志​​

1.题目

​​牛客题目链接​​​​洛谷题目链接 2022.6.15 (未设置特判0的测试点,waiting…)​​

nk

题号:NC16756
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的值减1为指数,以10为底数的幂之和的形式。例如:123可表示为 1102+2101+3*100这样的形式。
与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的值-1为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被选来,作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为 0,1,....R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5和6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码,通常使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。

在负进制数中是用-R 作为基数,例如-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:
110001=1*(-2)5+1*(-2)4+0*(-2)3+0*(-2)2+0*(-2)1 +1*(-2)0

设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,...,-20}

输入描述:
第一个是十进制数N(-32768 ≤ N ≤ 32767); 第二个是负进制数的基数-R。

输出描述:
输出此负进制数及其基数,若此基数超过10,则参照16进制的方式处理。

lg

题目描述

我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 (负)进制转换 (牛客)_c++ 为底数的幂之和的形式。例如 (负)进制转换 (牛客)_十进制数_02 可表示为 (负)进制转换 (牛客)_十进制数_03 这样的形式。

与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置为指数,以 (负)进制转换 (牛客)_c++_04 为底数的幂之和的形式。

一般说来,任何一个正整数 (负)进制转换 (牛客)_c语言_05 或一个负整数 (负)进制转换 (牛客)_十进制数_06 都可以被选来作为一个数制系统的基数。如果是以 (负)进制转换 (牛客)_c语言_05(负)进制转换 (牛客)_十进制数_06 为基数,则需要用到的数码为 (负)进制转换 (牛客)_c++_09

例如当 (负)进制转换 (牛客)_c++_10 时,所需用到的数码是 (负)进制转换 (牛客)_十进制数_11,这与其是 (负)进制转换 (牛客)_c语言_05(负)进制转换 (牛客)_十进制数_06 无关。如果作为基数的数绝对值超过 (负)进制转换 (牛客)_c++,则为了表示这些数码,通常使用英文字母来表示那些大于 (负)进制转换 (牛客)_进制转换_15 的数码。例如对 (负)进制转换 (牛客)_十进制数_16 进制数来说,用 (负)进制转换 (牛客)_c语言_17 表示 (负)进制转换 (牛客)_c++,用 (负)进制转换 (牛客)_c++_19 表示 (负)进制转换 (牛客)_c语言_20,用 (负)进制转换 (牛客)_c语言_21 表示 (负)进制转换 (牛客)_进制转换_22,以此类推。

在负进制数中是用 $-R $ 作为基数,例如 (负)进制转换 (牛客)_进制转换_23(十进制)相当于 (负)进制转换 (牛客)_c语言_24(负)进制转换 (牛客)_c语言_25进制),并且它可以被表示为 (负)进制转换 (牛客)_c++_04 的幂级数的和数:

(负)进制转换 (牛客)_进制_27

设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数。

输入格式

输入的每行有两个输入数据。

第一个是十进制数 (负)进制转换 (牛客)_进制转换_28
第二个是负进制数的基数 (负)进制转换 (牛客)_十进制数_06

输出格式

输出此负进制数及其基数,若此基数超过 (负)进制转换 (牛客)_c++,则参照 (负)进制转换 (牛客)_十进制数_16 进制的方式处理。

样例 #1

样例输入 #1

30000 -2

样例输出 #1

30000=11011010101110000(base-2)

样例 #2

样例输入 #2

-20000 -2

样例输出 #2

-20000=1111011000100000(base-2)

样例 #3

样例输入 #3

28800 -16

样例输出 #3

28800=19180(base-16)

样例 #4

样例输入 #4

-25000 -16

样例输出 #4

-25000=7FB8(base-16)

提示

【数据范围】
对于 (负)进制转换 (牛客)_十进制数_32 的数据,(负)进制转换 (牛客)_十进制数_33(负)进制转换 (牛客)_进制转换_34

(source: NOIp2000提高组第一题)

2.分析

理解整个进制转换的过程,就是在不断进行除法运算并调整~

举例子:
-15 -2 110001
//模拟一下过程
-15 /-2 = 8…1 (原本是 7 … -1,但是余数非负~,modify)
8 / -2 = -4…0
-4/ -2 = 2…0
2 / -2 = -1…0
-1/ -2 = 1…1
1 / -2 = 0…1
逆序输出余数即为所求~

3.代码

nk

#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
char base[20] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'}; //支持到20进制

int main()
{
int n, b;
while (cin >> n >> b)
{
vector <int> res;
printf("%d=",n);
if (n) //特判0!!!
{
while (n)
{
int t = n / b; //商
int y = n % b; //余数
if (y < 0)
{
t++; //商 +1
y -= b; //余数-=base
}
n = t; //调整
res.push_back(y);
}
reverse(res.begin(), res.end());
for (auto x : res)
cout << base[x];
}
else
printf("0");
printf("(base%d)\n", b);
}
return 0;
}

lg

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
//进制转换
char ba[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J' };

int main()
{
int n, base;
cin >> n >> base; //待转换的数字 和 进制
cout << n << "="; //转换前
vector <int> res;
while (n)
{
int sh = n / base; //商
int yu = n % base; //余数
if (yu < 0)
sh += 1, yu -= base;
res.push_back(yu);
n = sh;
}
if (res.empty())
cout << 0;
else {
reverse(res.begin(), res.end());
for (auto x : res) //范围for
printf("%c", ba[x]);
}
printf("(base%d)", base);
return 0;
}

4.总结

注意特判0~

5.更新日志

2022.6.12 整理上传

欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~


举报

相关推荐

0 条评论