进制转换————杭电oj 2031题(c语言解决)
Posted mid2dog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进制转换————杭电oj 2031题(c语言解决)相关的知识,希望对你有一定的参考价值。
前言
来进制转换吧!
做到后面发现前面还有个2031漏网之鱼
轻微强迫症决定解决它
补一波知识,以后需要转换也能直接从这里copy代码,哈哈
题目
基础知识
十进制转R进制规则:十进制数除以R进制得A,存余数,再用A除以R进制得A,存余数……直至A=0。最后所有余数倒置就是转换得数。
看这个可能看不大懂,直接想想当初如何把十进制转换二进制的吧!
比如,24,转换成二进制就是。。
11000
差不多就这意思(手残党画不出什么好东西)
然后我们试试三进制!
还是用可怜的24来试试
啊我 cao
我要被我的画风丑哭了
不管了,验证一下是不是220,3的0次0+3的1次2+3的2次*2=24!
然后以此就可以类推456789进制了
然后,开始验证大于十的进制,比如,十六进制。
来个大点的数,比如31
于是,不管几进制,只要是从十进制转换而来的,就可以用除余转化。
同理,如果你想x进制转换到y进制,只要把它先按位转换成十进制,再转换成y进制就好了。
还有个地方,我们需要把15转换为十六进制的F
这个很简单啊,比如a[i]里的余数是15,我们就可以。。
a[i]='A'+a[i]-10;
因为10的话就是A,很好理解哒。
最后还有个小坑小坑小坑坑
负数!
负数不能直接转换,要转换为正数然后转换完了再添负号,不然答案不对。。
(我也不知道为什么)
然后附上ac代码
#include<stdio.h>
#include<math.h> // abs,你懂我也懂。
int main()
int a[100]; // 开个数组存余数
int N,R;
while(~scanf("%d%d",&N,&R))
if(N<0)printf("-"); //负数先输出负号
N=abs(N); //然后转正
int a[1000],i=0;
for(;N>0;i++)
a[i]= N % R;
N = N / R;
i--;//因为循环结束i已经跑到末尾+1去了
for(;i>=0;i--)
if(a[i]>9) printf("%c",a[i]+'A'-10);
else printf("%d",a[i]);
putchar('\\n');
话说最近经常看到马孟起关云长赵子龙他们成功ac,只要我在做都能看到那几个三国大佬,这成功次数和提交次数比例。。。。
这莫非是某个用爬虫写了个脚本抓取网上ac自动提交?
以上是关于进制转换————杭电oj 2031题(c语言解决)的主要内容,如果未能解决你的问题,请参考以下文章