这个题的题目真的太恶心了。
重点是他的题目描述和他的目标没啥关系。
和最终目的有关系的只有这么一句话:”输出此负进制数及其基数,若此基数超过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; }
总结:这个题依然和前几个差不多,重点是他那难读的题目和坑人的负数,但只要在多想几遍,多看几遍就可以做出来了。