原题链接:蓝桥杯算法训练VIP-幂方分解
解题思路:
将需要转化的数转化成二进制数即可,题中的137可以转化为10001001,根据进制转化的规则,很容易得到137 = 2^7+2^3+2^0,7,3,0分别为10001001从末尾从零开始数那三个1的下标。然后在递归的进行7,3,0的相关操作。直到不能分解为止,也就是分解到2、1、0时候,2可以直接输出2,1可以直接输出2(0),0不需要输出。详情参考代码注释
注意事项:
注意事项已在代码注释中给出。
参考代码:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//输入的数
Recursion(n);//递归
}
public static void Recursion(int n) {
ArrayList<Integer> binary = convertBinary(n);//存储得到的n转化成的二级制集合
for (int i = binary.size()-1; i >= 0; i--) {//因为题设是按指数递减输出的,故从集合末端开始遍历
if (binary.get(i) != 0) {//如果遍历到的元素值不为0.就代表有值为2(i)的家数
if(i >= 2) {//如果i大于等于2,就说明还可以继续分解,按if语句里的输出
System.out.print("2(");//
Recursion(i);//继续分解i;
Boolean ishave = false;//记录后面是否还有输出
for(int j = i-1; j >= 0; j-- ) {//从i开始遍历,如果未遍历的二进制集合值全是0,就代表后面已经没有了
if(binary.get(j) != 0) {//如果出现了非零数就代表后面还有输出,跳出循环
ishave = true;
break;
}
}
if(ishave) {//如果后面还有输出就需要补上+号,如果没有则直接输出)即可
System.out.print(")+");
}else {
System.out.print(")");
}
}else if (i == 1) {//如果i=1,就代表为2(1),直接输出2即可
if(binary.get(i-1) == 0) {//因为i=1就代表后面只可能出现2(0),如果集合里下标为0的值为0就代表没有2(0)无须补上+号
System.out.print("2");
}else {
System.out.print("2+");
}
}else if (i == 0) {//如果i = 0,直接输出2(0)即可,后面一定没有输出了
System.out.print("2(0)");
}
}
}
}
//除基取余法将n转化为二进制集合,4的转化的二进制集合为001,代表4可以转化为0个2(0),0个2(1),1个2(2)相加
public static ArrayList<Integer> convertBinary(int n) {
ArrayList<Integer> binary = new ArrayList<Integer>();
while (n > 0) {
binary.add(n % 2);
n = n/2;
}
return binary;
}
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复