原题链接:蓝桥杯算法训练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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复