zoukankan      html  css  js  c++  java
  • 负进制问题:从余数的角度考虑进制

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

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

    正如 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;
    }
  • 相关阅读:
    【Java8】 @FunctionalInterface 函数式接口
    集合使用copy与mutableCopy的区别
    GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验
    podspec文件介绍
    iOS系统app崩溃日志手动符号化
    webView文本长按显示英文
    深拷贝
    view向全屏延伸时的属性设置
    iOS 模拟器截屏快捷键
    mysql 优化常用语句
  • 原文地址:https://www.cnblogs.com/zwx7616/p/11309335.html
Copyright © 2011-2022 走看看