进制转换————杭电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自动提交?

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zjjcxy_long/article/details/104088561