1 条题解
-
0
自动搬运
来自洛谷,原作者为

kIG7Z8oP
这个家伙很菜,什么也没有留下搬运于
2025-08-24 21:21:27,当前版本为作者最后更新于2018-10-29 20:42:09,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
update:
修改了一些语焉不详之处 19/11/16
新加了几个
坑空 19/11/16(没错就是CSP2019的day1)
话说你们为什么都非要先转十进制啊!!!
还要用什么快速幂的说……
我鈦蒟蒻,不会怎么办啊QAQ
今天来教大家读入优化~~
不要急,往下看,正解很简单❤
首先
假设我们都知道,getchar()明显快于scanf(),所以常常有人用这个来卡常数压时间读入一个整数的方法:
inline int read(int &x) { x=0; int f=1; char c=getchar(); while(c>'9'||c<'0') { if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9') x*=10,x+=c-'0',c=getchar(); x*=f; }//读完后,是数字的下一个字符 //这是一种任意十进制快速读法而那种十进制读入法是可以优化的
优化方法如下
inline int read() { int x=0; char c=getchar(); while(c<48||c>47)//c<'0'||c>'9' c=getchar(); while(c>47&&c<58) x*=10,x+=c-48,c=getchar() return x; }//仅能读正整数亲测read()比scanf()快大约5倍
那么大家想一想,如果n=10,题目中输入时
第二行不就是read()吗?!
那么问题来了,怎么从十进制读入变成n进制读入呢?
相信聪明的你一定想到了办法:-)我们在读入优化时(假设你已经会了读入优化……)是按位读的(十进制位)
然后我们只需按位读(n进制位)
注意别忘了特判'A'~'F'
所以可以这样写(读入)
#include<cstdio> int n; inline int isint(char c)//可将'0'~'9'及'A'~'F'转化成如题所示数字并将非数字字符返回-1注意此时c并不会被修改 { if(c>='A'&&c<='F') return c-55;//'A'=65,10=10; if(c>47&&c<58) return c-48; return -1; } inline void read(int &x) { char c=getchar(); while(isint(c)==-1) c=getchar(); while(~isint(c)/*判断是不是数*/) x*=n,x+=isint(c),c=getchar(); }//read()后会读到数字后的第一个字符(读完)好的本题前两行输入完成**❤**
现在你手里有一个以int表示的n进制数x
其实输出也能优化
常规
卡常压时间技巧如下void otp(int k) { if(!k) return; otp(k/10); putchar(k+48); }其实这已经很好了(当然也不是不能改)
假设你前面已经全明白了(不明白请回头深造)
输出优化也可以被方便的转成m进制
方法如下
int m; inline char cic(int x)//change into char 意在将一个n进制数的某位转成对应的m进制 { if(x<10)//毕竟不会出负数,算个小优化~ return x+48; return x-10+'A'; } void otp(int k) { if(!k) return; otp(k/m); putchar(cic(k%m)); }以下是题解
创建和邪落谷,警惕陶片放逐
为了您和他人的安全,请勿抄标程
(直接粘贴标程并提交有惊喜呦~~)
#include<cstdio> int n,x,m; inline int isint(char c) { if(c>='A'&&c<='F') return c-55; if(c>47&&c<58) return c-48; return -1; } inline int read() { int x=0; while(~isint(c)) x*=n,x+=isint(c),c=getchar(); return x; } inline char cic(int x){ if(x<10) return x+48; return x-10+'A'; } void otp(int k) { if(!k) return; otp(k/m); putchar(cic(k%m)); } int main() { scanf("%d",&n); x=read(); scanf("%d",&m); otp(x); putchar('\n'); }希望能帮助到大家,谢dalao们观看,欢迎来喷呦
- 1
信息
- ID
- 145
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者