这道题实际上是一道数学题~
首先我们要清楚余数:
15 / 4=3…3
15 / -4=-3…3
-15 / 4= -3…-3
-15/-4=3…-3
开始我也不知道负数除以负数的余数是负数…奇怪的知识增加了~
然后题目说了十进制数 ,第二个是负进制数的基础.
十进制数可正可负 ,但是第二个负进制数一定是负数.
所以我们求以前进制数的时候,余数都是正数对不对,但是这里可能会出现负数.例如上面的:一个负数除以一个正数或者负数的余数都等于负数.但是最后结果不能有负数怎么办呢?很简单,我们只需要让余数-除数,商+1即可.
为什呢?对于上面只有两种情况1(被除数为负,除数为负)2(被除数为正,除数为负):-15 /-4 =3…-3 ,15/-4=-3…3
除数的绝对值一定大于余数的绝对值。针对上面的情况,如果余数为负数,余数减去除数的值一定是正数。
证明:我们设 余数为 r ,除数为 c,商为m
被除数=c*m+r
c*(m+1)+r-c=cm+c+r-c=cm+r=被除数
所以当余数为负时,我们像上面这样处理就好了~其他和求一般的进制方法没啥区别,下面是AC code:
#include <iostream>
#include <vector>
using namespace std;
vector<char > t;
int main()
{
int n,m,a;
cin>>n>>m;
a=n;
char c;
while(n!=0)
{
int r=n%m;
int k=n/m;
if(r<0)
{
r-=m; //余数减去除数
n=k+1; //商加上1
}
else
{
n=k;
}
if(r>=10)
{
c='A'+r-10;
}
else
{
c='0'+r;
}
t.push_back(c);
}
cout<<a<<"=";
for(vector<char >::iterator it=t.end()-1;it>=t.begin();it--)
{
cout<<*it;
}
cout<<"(base"<<m<<")";
return 0;
}