我赶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",有两个错误:

  1. 没有'G'
  2. 输出基本是空的(我也不知道为啥

不管了放个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 【进制转换】的更多相关文章

  1. 洛谷P1017 进制转换

    洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...

  2. 洛谷p1017 进制转换(2000noip提高组)

    洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...

  3. 洛谷——P1017 进制转换

    P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1\times ...

  4. 集训作业 洛谷P1017 进制转换

    这个题的题目真的太恶心了. 重点是他的题目描述和他的目标没啥关系. 和最终目的有关系的只有这么一句话:”输出此负进制数及其基数,若此基数超过10,则参照16进制的方法处理.“ 我们通过看这句话可以发现 ...

  5. 洛谷 P1017 进制转换

    推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...

  6. luogu P1017 进制转换

    感觉这个题 是真的恶心 本来单纯就递归写,发现好难 后来用数组记录 然后考虑 指数为 奇和偶数 分别 <0 和 > 进制的情况 其实 用进制数为3 大概讨论四种情况就可以了 由于最近就是在 ...

  7. [NOIP2000] 提高组 洛谷P1017 进制转换

    题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+3*10^ ...

  8. 洛谷—— P1017 进制转换

    https://www.luogu.org/problem/show?pid=1017#sub 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1) ...

  9. P1017 进制转换

    模拟水题,直接上代码 #include <bits/stdc++.h> using namespace std; const int maxn = 100000; int main() { ...

  10. P1017 进制转换 (负进制转换)

    和平常的转化差不多 加多一步 如果余数 < 0, 那么余数减去除数(此时除数是负),商数加1 #include<cstdio> #define _for(i, a, b) for(i ...

随机推荐

  1. 查看mysql 的版本信息

    在进入mysql的情况下 在终端的情况下:

  2. jmeter 把返回数据写到文件

    jmeter如何把返回数据写入到文件 作者:WhoisTester    2015-10-20 20:11 1. 首先我们可以使用 regular expression extractor 正则表达式 ...

  3. golang简介

    GO语言是Google于2009年推出的一门新的系统编程语言 特点: 静态编译 垃圾回收 简洁的符号和语法 平坦的类型系统 基于CSP的并发模型 高效简单的工具链 丰富的标准库 为什么选择go语言 编 ...

  4. 关于php中trim、ltrim和rtrim

    以ltrim为例 先看手册说明先 定义和用法 ltrim() 函数从字符串左侧删除空格或其他预定义字符. 语法 ltrim(string,charlist) 参数 描述 string 必需.规定要转换 ...

  5. [fw]Linux系统使用time计算命令执行的时间

    Linux系统使用time计算命令执行的时间 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的.所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗.例 ...

  6. Servlet+AJAX实现的模拟电梯调度

    需求产生: 大三下学期天天在学校的同一栋教学楼上课,每天要等四次电梯,有次等电梯无聊了,就想到电梯的运行逻辑该如何用程序来表达呢? 问题描述: 大学的那栋楼有21层,不过在页面中画21层有点密,所以只 ...

  7. 关联查询总结,left join 和 inner join 区别和优化

    left join 是做左外关联,主表内容都会显示:符合关联条件的附表内容才会显示出来. inner join 是内关联,没有主表附表的概念:两个表中,同时符合关联条件的数据才会显示出来. left ...

  8. 同一客户端多个git账号的配置

    同一客户端多个git账号的配置 同一客户端多个git账号的配置 步骤一:用ssh-keygen命令生成一组新的id_rsa_new和id_rsa_new.pub. 1 ssh-keygen -t rs ...

  9. vector中数据释放崩溃问题

    struct LINE { char securityID[32]; /*!< 证券代码 */ int64_t dateTime; /*!< 日期时间(日期变化)YYYYMMDDhhmms ...

  10. vue.js(6)--v-model

    v-model实现数据的双向绑定(简易计算器实例) 简易计算器实例 <!DOCTYPE html> <html lang="en"> <head> ...