本题思路是将二进制除法转化为加法,原题可化为全为1的二进制数整除除数,我将除数不断移位直到相加后全为1,得到的结果的位数就是取余后的商。注意考虑除数为1的情况,WA了一次。
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt())
{
int number = sc.nextInt();
if (number % 2 == 0 || number == 1)
{
System.out.format("2^? mod %d = 1\n", number);
continue;
}
String s = Integer.toBinaryString(number);
String result = new String(s);
int zeroIndex = result.lastIndexOf("0");
int deprecated = 0;
while (zeroIndex != -1)
{
deprecated += result.length() - zeroIndex - 1;
result = binaryAdd(result.substring(0, zeroIndex + 1), s);
zeroIndex = result.lastIndexOf("0");
}
System.out.format("2^%d mod %d = 1\n", result.length() + deprecated, number);
}
}
static String binaryAdd(String s1, String s2)
{
StringBuilder sb1 = new StringBuilder(s1);
StringBuilder sb2 = new StringBuilder(s2);
sb1 = sb1.reverse();
sb2 = sb2.reverse();
int max = sb1.length() > sb2.length() ? sb1.length() : sb2.length();
StringBuilder sb = new StringBuilder();
int prev = 0;
for (int i = 0; i < max; i++)
{
int c1 = i < sb1.length() ? sb1.charAt(i) - '0' : 0;
int c2 = i < sb2.length() ? sb2.charAt(i) - '0' : 0;
int r = c1 + c2 + prev;
if (r == 0)
{
sb.append("0");
prev = 0;
}
else if (r == 1)
{
sb.append("1");
prev = 0;
}
else if (r == 2)
{
sb.append("0");
prev = 1;
}
else
{
sb.append("1");
prev = 1;
}
}
if (prev == 1)
sb.append("1");
return sb.reverse().toString();
}
}