【洛谷OJ】【JAVA】P1017 进制转换

36 篇文章 0 订阅

https://www.luogu.org/problemnew/show/P1017

顺便了解一下取模的计算,可以参考WIKI:https://en.wikipedia.org/wiki/Modulo_operation

给定一个正整数q,任意一个整数a,一定存在等式 :

a =nq + r;

其中 n、r 是整数,且 0 ≤ r < q,则称 n 为a 除以 q 的商,r 为 a 除以 q 的余数。

当r非零时,商取正数或负数,和使用的编程语言有关,具体有如下三种可能:

(1)大部分实现采用截断的方式,即q=trunc(a/n),向0所在方向取整,如3/2=1

r=a-n\operatorname {trunc} \left({\frac {a}{n}}\right)

(2)第二种是采用floor function(可以理解为向下取整),即q = ⌊a/n⌋,余数的符号和除数保持一致,即使余数已经是负数了,仍然向下取整,即3/-2=-2

r=a-n\left\lfloor {\frac {a}{n}}\right\rfloor

(3)还有一类是余数总是正的,即0 ≤ r,即:

n>0\Rightarrow q=\left\lfloor {\frac {a}{n}}\right\rfloor

n<0\Rightarrow q=\left\lceil {\frac {a}{n}}\right\rceil

等价于:

q=\operatorname {sgn}(n)\left\lfloor {\frac {a}{\left|n\right|}}\right\rfloor

 

其中:

\operatorname{sgn}(x):={\begin{cases}-1&{\text{if }}x<0,\\0&{\text{if }}x=0,\\1&{\text{if }}x>0.\end{cases}}

 

也即:

{\displaystyle \operatorname {sgn}(x)={\frac {\mathrm {d} }{\mathrm {d} x}}\left|x\right|,\quad x\neq 0}

因此:

r=a-|n|\left\lfloor {\frac {a}{\left|n\right|}}\right\rfloor

import java.util.Scanner;

public class Main {
	private static Scanner cin;
	
	public static void main(String args[]) throws Exception {
		cin = new Scanner(System.in);
		int n = cin.nextInt();
		int r = cin.nextInt();
		int t = n;
		int modRet;
		StringBuilder sb = new StringBuilder("");
		while(t/r != 0 || t%r!=0) {
			modRet = t%r;
			//如果取模后结果为负数,t/r的结果需要向高位借1
			if(modRet < 0) {
				t = t/r + 1;
				modRet = modRet - r;
			}
			else {
				t = t/r;
			}
			sb.insert(0, modRet>9?(char)(modRet+55):(char)(modRet+48));
		}
		sb.insert(0,String.format("%d=", n));
		sb.append("(base"+r+")");
		System.out.println(sb.toString());
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值