题解 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 ...
随机推荐
- Python模块之pdfkit
1.安装依赖 pip install python-docx #Python下的Microsoft Word 2007工具 pip install PyPDF2 #Python下的PDF工具 pip ...
- [CF643E]Bear and Destroying Subtrees(期望,忽略误差)
Description: 给你一棵初始只有根为1的树 两种操作 1 x 表示加入一个新点以 x为父亲 2 x 表示以 x 为根的子树期望最深深度 每条边都有 \(\frac{1}{ ...
- linux php 中session 多站点共享session问题
linux php 中session默认file 假如修改为redis php.ini session.save_handler = "files"; session.save_p ...
- ArrayList与List<T>的区别
ArrayList alist = new ArrayList(); //ArrayList(object value),所以ArrayList可以存储任何类型,如果存储值类型的话会进行装箱操作,在操 ...
- NGUI的输入框制作(attach- input filed script的使用)
一,我们添加一个sprite,给这个sprite添加一个box collider ,然后添加input filed script,如下图: 二,我们给sprite添加一个child的label,然后绑 ...
- JVM(11)之 G1收集器
开发十年,就只剩下这套架构体系了! >>> 在前两篇博文中讲解了新生代和年老代的收集器,在本篇博文中介绍一个收集范围涵盖整个堆的收集器--G1收集器. 先讲讲G1收集器的特点, ...
- js的label标签语句与with语句的用法
/** * label标签语句 * - 语法: * 标签名: 语句 * 如:start: n = 1; * 上面标签start可以被之后的break或continue语句引用 * - label标签语 ...
- eclipse不小心删除文件如何恢复
转自:https://blog.csdn.net/u012129031/article/details/78791277 1.右键点击java项目工程名,选择restort from history, ...
- elasticsearch 深入 —— Search Type检索类型
在此我们再给出那个查询的代码: $ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{ "query": ...
- DNS域名系统,简述工作原理
DNS工作原理: 当DNS客户端需要在程序中使用名称时,它会查询DNS服务器来解析该名称.客户端发送的每条查询信息包括三条信息:指定的DNS域名,指定的查询类型,DNS域名的指定类别.基于UDP服务, ...