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
(2)第二种是采用floor function(可以理解为向下取整),即q = ⌊a/n⌋,余数的符号和除数保持一致,即使余数已经是负数了,仍然向下取整,即3/-2=-2
(3)还有一类是余数总是正的,即0 ≤ r,即:
等价于:
其中:
也即:
因此:
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());
}
}