集训作业 洛谷P1017 进制转换

这个题的题目真的太恶心了。

重点是他的题目描述和他的目标没啥关系。

和最终目的有关系的只有这么一句话:”输出此负进制数及其基数,若此基数超过10,则参照16进制的方法处理。“

我们通过看这句话可以发现,这就是个带负数进制的进制转换!!!

所以一点都不难,但负数有时候会出现一些奇怪的事情,比如让他的余数变成负数。这样的话就要用到我们小学都学过的一个知识点了。

一个数不够减怎么办?向前一位借。就是这么简单,我们把这个地方特判一下就好了。

#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
long long s[1005];
long long a,h,b,shu,zshu;
string sz[20]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H"};
int main()
{
	cin>>a>>b;
	cout<<a<<"=";
	while(a!=0)//又是经典的转换环节。
	{
		h++;
		s[h]=a%b;
		a/=b;
		if(s[h]<0)//少减一次,加上b就是正数了,不知道为什么的同学请自行百度整数和负数的取余操作。
		{
			s[h]-=b;
			a++;
		}
	}
	for(int i=h;i>=1;i--)//倒叙输出
	{
		cout<<sz[s[i]];
	}
	printf("(base%lld)",b);
	return 0;
}

总结:这个题依然和前几个差不多,重点是他那难读的题目和坑人的负数,但只要在多想几遍,多看几遍就可以做出来了。

posted @ 2020-05-08 22:13  lichangjian  阅读(136)  评论(0编辑  收藏  举报