zoukankan      html  css  js  c++  java
  • 进制转换(负进制) Luogu 1017

        最近匆忙刷题,突然发现自己数学废掉了 ,居然忘了进制转换了QAQ~,后来我身边的王大佬又教了我一遍。

        进制转换多数用的是短除法(别人是这么叫的),就是除以进制数后,记录余数,一直除到零为止,然后把记录的余数倒序输出,10及以上的用A、B等字母表示。然而如果遇到负进制(******),就应考虑到余数为负数的情况,例如:-3 mod -2 = -1 ,这时,就应该给这个余数加上进制数的绝对值,同时将整除得到的数加上现在的余数,为了保证计算的正确性,因为我们给余数加了进制数,就相当于做除法时 被除数 少减了一个 除数(不妨在这里我们认为除法就是一连串的减法),例如:如果进制为-2,-3 mod -2 = -1,那 -1 就应该加 2 = 1,同时,-3 mod -2 = 1 就应在 1 上加 1,成为 2,只有这样 -3 ÷ -2 = 2 ……1 才成立。 

        说到底,方法还是短除法,只是自己处理一个稍微变形的除法而已。(~A~|||

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 using namespace std;
     8 int n,r,m;
     9 int x;
    10 int ji[200000];
    11 int main(){
    12     scanf("%d %d",&n,&r);  //n 十进制数; r 进制数
    13     x=n;
    14     while(n!=0){   //短除法
    15         m++;
    16         ji[m]=n%r; 
    17         if(ji[m]<0) {     //处理余数为负数的情况
    18             n=n/r+1;
    19             ji[m]+=abs(r);
    20         }else 
    21         n=n/r;
    22     }
    23     printf("%d",x);   //输出
    24     printf("=");
    25     for(int i=m;i>=1;i--){
    26         if(ji[i]<=9) printf("%d",ji[i]);
    27         else printf("%c",char(64+ji[i]-9));
    28     }
    29     printf("(base");
    30     printf("%d",r);
    31     printf(")");
    32     return 0;
    33 }
  • 相关阅读:
    c#隐藏和重写基类方法的区别
    c#事件(续委托之后)
    c# 中接口和抽象类的区别
    call 和apply 的一个记录
    string 和 stringbuilder 的区别
    传值和传引用
    值类型和引用类型
    标签选择器与字体连写
    input表单案例
    codeforces 676B B. Pyramid of Glasses(模拟)
  • 原文地址:https://www.cnblogs.com/Misaki-Mei/p/7281794.html
Copyright © 2011-2022 走看看