负进制转换

一般我们求的较多的就是十进制转二进制,八进制,十六进制,这样的转换我们只需要不断的取余即可,然后输出

附上代码:

#include<iostream>
using namespace std;
int main()
{
     char A[]={'A','B','C','D','E','F','G','H','I','J'};
     int N,R;//N代表要转换的数,R代表要转换成R进制; 
     cin>>N>>R;//R为正
     int B[1000];
     cout<<N<<"=";
     int x=0; 
     while(N!=0)
     {
         B[x]=N%R;
         N/=R;
         x++;
     }
     x--;
     for(int i=x;i>=0;i--)//倒叙输出 
     {
         if(B[i]>=10) cout<<A[B[i]-10];//超出10,用字母表示 
         else cout<<B[i];
          }
    cout<<"(base"<<R<<")";
    return 0;     
 } 

然而出了将一个数转换为正进制数,我们还有将一个数转换为负进制数。遇到了负进制数,我们取余的时候余数会出现负的情况。 我们就要处理这个负数的情况。

我们可以经过以下的变换:

N/R=B.....X:     N是被除数,R是除数(R为负数),B是商,X是余数。

B*R+X=N :

B*R+X-R+R=N:

(B+1)*R+X-R=N:

经过这样的变换之后那么X-R就是正数了。那么我们也可以得到一个结论:当余数为负数时,余数=余数-除数(除数为负数),商=商+1。

这样我们就可以求负进制了。

代码:

#include<iostream>
using namespace std;
int main()
{
   char A[]={'A','B','C','D','E','F','G','H','I','J'};
   int N,R;
   cin>>N>>R;
   cout<<N<<"=";
   int B[1000];
   int x=0;
   while(N!=0)
   {
           B[x]=N%R;
           N/=R;
           if(B[x]<0)//核心代码:如果余数为负数,那么余数=余数+除数的绝对值,商加上1; 
           {
               B[x]-=R;
               N++;    
        }
           x++;
       }
       x--;
    for(int i=x;i>=0;i--)
    {
            if(B[i]>=10) cout<<A[B[i]-10];
             else cout<<B[i];
    }
    cout<<"(base"<<R<<")"; 
    return 0;    
}
原文地址:https://www.cnblogs.com/zhoubo123/p/11400867.html