尾数前移问题
问题分析:
首先,理解何为尾数前移问题: 例如:一个整数n的尾数是9,把尾数9移到其前面(成为最高位)
后所得的数为原整数n的3倍,这就是尾数前移问题。
后所得的数为原整数n的3倍,这就是尾数前移问题。
将其一般化:
就是一个整数n的尾数是q,把尾数q移到其最高位,所得的数为原整数n的p倍 。
解题思路:
可以采用逆向思维
设n为123***2q,尾数q移到前面变成q123***2, 意味着 q123***2可以整除p,商为123***2q
设n为123***2q,尾数q移到前面变成q123***2, 意味着 q123***2可以整除p,商为123***2q
竖式除法模拟:
c = q % p
;
b = q / p ;
这样就能将b作为n的首位数 进入循环,当c=0或商b=q时结束
即 循环条件为 c != 0 || b != q
在循环中,计算被除数a = c * 10 + b
注意b是上一轮试商的商, 即向后递进: b = a / p; c = a % p;
代码实现如下:
public class Demo1 {
public static void main(String[] args) {
int a; // 用于存储进位的数
Scanner input = new Scanner(System.in);
System.out.println("请输入整数n的指定尾数:");
int q = input.nextInt(); // 整数n的尾数
System.out.println("请输入前移后n的倍数:");
int p = input.nextInt(); // n的倍数
int b = q / p; // 商
int c = q % p; // 余数
System.out.print("n(" + q + "," + p + ")=" + b);
//当余数不为0或者商不等于它本身,执行循环
while(c != 0 || b != q){
//持续进行向后进位
a = c * 10 + b; //进位
b = a / p; //将商赋值给b
c = a % p; //将余数赋值给c
System.out.print(b); //每次都将b的结果打印出来
}
System.out.println();
input.close();
}
}