进制转换(负进制) 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 }
时间: 2024-10-18 08:33:30

进制转换(负进制) Luogu 1017的相关文章

java 16进制转换10进制

public static String toHexString2(byte[] b) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; ++i) { buffer.append(toHexString2(b[i])); } return buffer.toString(); } public static String toHexString2(byte b) { char[] buffer =

( 转)Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法

一.类型比较 bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据,存储大小为 8 个字节.一个字节就是8位,那么bigint就有64位 int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据,存储大小为 4 个字节.int类型,最大可以存储32位的数据 smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据,存储大小为 2 个

蓝桥杯 16进制转换8进制

蓝桥杯 16进制转换8进制 我表示我自己太渣渣了,总是超时,通不过测试. 题目 问题描述 给定n个十六进制正整数,输出它们对应的八进制数.输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000.输出格式 输出n行,每行为输入对应的八进制正整数.注意 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0.样例输入239123ABC样例输出7144

10进制转换2进制的互相转换

要从右到左用二进制的每个数去乘以2的相应次方例如:二进制数1101.01转化成十进制1101.01(2)=1*20+0*21+1*22+1*23 +0*2-1+1*2-2=1+0+4+8+0+0.25=13.25所以总结起来通用公式为:abcd.efg(2)=d*20+c*21+b*22+a*23+e*2-1+f*2-2+g*2-3或者用下面这种方法:把二进制数首先写成加权系数展开式,然后按十进制加法规则求和.这种做法称为"按权相加"法.2的0次方是1(任何数的0次方都是1,0的0次方

javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)

//十进制转其他 var x=110; alert(x); alert(x.toString(8)); alert(x.toString(32)); alert(x.toString(16)); //其他转十进制 var x='110'; alert(parseInt(x,2)); alert(parseInt(x,8)); alert(parseInt(x,16)); //其他转其他 //先用parseInt转成十进制再用toString转到目标进制 alert(String.fromChar

各进制转换10进制

十六进制41BD(16)转换成十进制 41BD (16) =4*163+1*162+11*161+13*160 =16384+256+176+13 =16829 十六进制A10C.8(16)转换成十进制 A10C.8(16) =10*163+1*162+0*161+12*160+8*16-1 =40960+256+0+12+0.5 =41228.5 八进制146.1(8)转换成十进制 146.1(8) =1*82+4*81+6*80+1*8-1 =64+32+6+0.125 =102.125 八

Java基础笔记(3) 进制与进制转换

---恢复内容开始--- 进制 在一般生活中,我们一直在应用的十进制,就是逢十进一,而今天我们要接触的是,计算机编程常用的进制!首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制! 1.什么是二进制? 就是只有0 和 1  每当遇到值为2 就向前进一位. 2.为什么计算机内部是二进制? 这就要从硬件说起,计算机是如何储存数据的,要知道我们网络传输,就是你要和别人一起聊天,你们隔着很远,到底是怎样才能让他收到你的聊天内容? 有一根网线还能说过去,毕竟网线链接终端我们也不知道连到哪,保不齐

Java 10进制转2、8、16进制转换 / 2、8、16进制转10进制转换

public static void main(String[] args) { int i = 10; System.out.println("***********10进制转换2进制.8进制.16进制************"); System.out.println(Integer.toBinaryString(i)); // 10转换2进制 System.out.println(Integer.toOctalString(i)); // 10转换8进制 System.out.p

PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有点要注意下,2.8.16进制转换时,使用的是系统的自己的函数. 所以,不管怎么高精度转换值可能大于2147483646. 另外, 32进制低精转换,最大值:2147483646: 32进制高精转换,最大值:77309411327: 64进制高精转换,最大值:133143986175. jinzhi.ph

java高精度进制转换

POJ1131   由于本题只有小数部分(整数部分均为0),故在进制转换的之后只能自己手写转换方法了.   8进制转换10进制的方法为,以0.75为例,应是7*8^-1 + 5*8^-2.所以呢,可以直接定位到小数点后一位,采用此方法进行计算. 1 import java.util.*; 2 import java.math.*; 3 4 public class Main 5 { 6 public static void main(String []args) 7 { 8 Scanner ci