240
功不唐捐,玉汝于成😡。

负进制问题:从余数的角度考虑进制

二进制,十进制,十六进制基数都是正的.

实际上每种进制上的数都是不断除以基数所得的余数;

正如 123,转化成二进制 

从最低位开始:

123%2=1 最后一位是 1

123=1+ 61*2

61%2=1 则倒数第二位是1

61=1+30*2

30%2=0则倒数第三位是0

30=15*2

15%2=1则倒数第四位是1

15=1+7*2

7.。。。。1

3.。。。。1

1.。。。。1

0结束

则123==1111011似乎进制转化就是这样转化 的,但是当时没有仔细考虑

当基数是负数时:余数存在是负数的情况

例如:-20 转化成-3进制 -20= -2+(-3)* 6;

余数是-2  ;将余数转化成正数可以将商加一即可

-20=(-2) +(-3)*7-(-3)=1+(-3)*7;如此分治求负进制

通过数组实现:

#include<iostream>

using namespace std;
int a[1000];
int main ()
{

    int n,m;
    cin>>m>>n;
    cout<<m<<'=';
    int i;
    for( i=0;;i++)
    {
        int rps=m%n;
        if(rps<0)rps-=n,m+=n;
        a[i]=rps;
        m/=n;
        if(m==0)break;
    }

    for(int j=i;j>=0;j--)
    {
        if(a[j]>=10)
           printf("%c", 'A'+a[j]-10);
        else 
            cout<<a[j];
    }
    cout<<"(base"<<n<<")"<<endl;
    return 0;
}

通过递归实现

//通过递归时,由于时从低位向高位进行求解,所以先 递归到最大位再进行输出

#include<iostream>
#include<cstdio>
using namespace std;

void p(int m,int n)
{
    if(m==0)return;
    int rps=m%n;
    if(rps<0)rps-=n,m+=n;
    p(m/n,n);
    if(rps>=10)
        printf("%c",'A'+rps-10);
    else
        cout<<rps;
}
int main ()
{
    int num,n;
    cin>>num>>n;
    cout<<num<<'=';
    p(num,n);
    cout<<"(base"<<n<<')';
    return 0;
}

 

posted @ 2019-08-06 15:39  BigXun  阅读(446)  评论(0编辑  收藏  举报