题解 P1017 【进制转换】
我赶jio这个题难道是让我们写快写?
不管了,赶紧把咕咕咕了一万年的题解写出来。
这个题就是考察负进制和在mod意义下的除法运算的基础运算。
(其实也没多大问题)
首先我们先假设一个原始数据\(num\)和基底\(base(1\leq base\leq20)\)
然后不妨设\(num=a*base+b\)(且$b = num\space mod\space a $ )
重点来了!
如果\(b<0\),我们就\(b-base,a+1\),很明显这样做是正确的。
为啥呢?因为base是负数。负数减去一个比第一个负数大的负数肯定是个正数,而且不影响后面的数字的拆开。
(恒等变换自己拆开式子便知道了)
我们其实只需要\(b\)这一个数据,让\(a*base\)留在原来剩下的num中继续递归就可以。
最后一个坑:
窝一开始设的char[]="0123456789ABCDEF",有两个错误:
- 没有'G'
- 输出基本是空的(我也不知道为啥
不管了放个cpp
#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
//用了string类型再错就去世
string str="0123456789ABCDEFG";
string realans="";
//注意我使用了传址调用,直接修改num的值
char getachar(int key,int &num,const int &base)
{
if (key<0)
key-=base,num+=base;
return str[key];//返回应该有的值
}
//工作函数,有点像快速输出的赶jio
void work(int num,int base)
{
if (num==0)return;
char ch=getachar(num%base,num,base);
//先记录一下当前的字符
//然后再直接下一层调用
work(num/base,base);
//最后注意将这一位上的放在原先的后面
//短除法的精髓所在
realans=realans+ch;
}
int main()
{
int num,jidi;
cin>>num>>jidi;
work(num,jidi);
//畅快的输出
cout<<num<<'='<<realans<<"(base"<<jidi<<')'<<endl;
return 0;
}
再放一个快速输出的板子,让读者自己感受一下qwq
//输出一个数字
template<typename T>void write(T num)
{
if (num<0)putchar('-'),num=-num;
if (num>9)write<T>(num/10);
putchar('0'+num%10);
}
//特化函数
void writeln(){}
//输出多个数字,默认空格隔开
template<const char split=' ',class T1,class ...T2>
void writeln(T1 &num,T2 &...rest)
{
write<T1>(num);
putchar(split);
writeln(rest...);
}
题解 P1017 【进制转换】的更多相关文章
- 洛谷P1017 进制转换
洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...
- 洛谷p1017 进制转换(2000noip提高组)
洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...
- 洛谷——P1017 进制转换
P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1\times ...
- 集训作业 洛谷P1017 进制转换
这个题的题目真的太恶心了. 重点是他的题目描述和他的目标没啥关系. 和最终目的有关系的只有这么一句话:”输出此负进制数及其基数,若此基数超过10,则参照16进制的方法处理.“ 我们通过看这句话可以发现 ...
- 洛谷 P1017 进制转换
推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...
- luogu P1017 进制转换
感觉这个题 是真的恶心 本来单纯就递归写,发现好难 后来用数组记录 然后考虑 指数为 奇和偶数 分别 <0 和 > 进制的情况 其实 用进制数为3 大概讨论四种情况就可以了 由于最近就是在 ...
- [NOIP2000] 提高组 洛谷P1017 进制转换
题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+3*10^ ...
- 洛谷—— P1017 进制转换
https://www.luogu.org/problem/show?pid=1017#sub 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1) ...
- P1017 进制转换
模拟水题,直接上代码 #include <bits/stdc++.h> using namespace std; const int maxn = 100000; int main() { ...
- P1017 进制转换 (负进制转换)
和平常的转化差不多 加多一步 如果余数 < 0, 那么余数减去除数(此时除数是负),商数加1 #include<cstdio> #define _for(i, a, b) for(i ...
随机推荐
- 编程语言-Ruby-问题整理
安装 https://github.com/oneclick/rubyinstaller2/releases/tag/RubyInstaller-2.6.0-1
- 解决bug:sprongboot2整合shiro,swagger2页面样式加载不出来问题
问题如题: 解决思路,把shiro拦截去掉之后发现swagger-ui.html页面接在的资源如下: 因此可以推断拦截器拦截了 "/swagger-resources" " ...
- 解决Ubuntu12.04下rpcbind: cannot open '/var/run/rpcbind/rpcbind.xdr' file for reading
不知道怎么回事,实验室的电脑在同学搞过之后,每次启动都报错 rpcbind: cannot open '/run/rpcbind/rpcbind.xdr' file for reading, errn ...
- jvm性能监控(4)–JVM的监控工具Jconsole
下面主要说一下怎么JConsole远程连接springboot 项目 java \-Djava.rmi.server.hostname=192.131.149.42 \-Dcom.sun.manag ...
- 11、numpy——字符串函数
NumPy 字符串函数 以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内置库中的标准字符串函数. ...
- bzoj2176 Strange string(字符串最小表示法)
Time Limit: 10 Sec Memory Limit: 259 MB 给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的 ...
- Android APP 登陆模块
首先我想强调一点.这个登陆的模块最好是放在另外一个线程里面来实现.否则有可能会爆出一系列的问题, 然后再与主UI 交互.这样就不会爆ANR异常 1.对于登陆模块的.首先大体的逻辑肯定是要清晰的. ...
- JS的video获取时长,出现问题汇总
<video id="my_video_1" controls="controls" style=" width: 700px; height: ...
- ltp-ddt nand_mtd_dd_rw_jffs2
error: 由于在uboot下没有发现坏块,将核心代码剥离出来调试: flash_eraseall -q -j /dev/mtd1mkdir -p /mnt/partition_nand_1419m ...
- bzoj1488 [HNOI2009]图的同构 Burnside 引理
题目传送门 bzoj1488 - [HNOI2009]图的同构 bzoj1815 - [Shoi2006]color 有色图(双倍经验) 题解 暴力 由于在做题之前已经被告知是 Burnside 引理 ...