P0010【普及组】幂次方(Java)

目录

题目描述

输入格式

输出格式

输入输出样例

输入#1

输出#1

输入#2

输出#2

数据范围

解题思路

代码


题目描述

任何一个正整数都可以用 22 的幂次方表示。例如 137=2^7+2^3+2^0137=27+23+20。

同时约定方次用括号来表示,即 a^bab 可表示为 a(b)a(b)。

由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)

进一步:

7= 2^2+2+2^07=22+2+20 ( 2^121 用 22 表示),并且 3=2+2^03=2+20。

所以最后 137137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)。

又如 1315=2^{10} +2^8 +2^5 +2+11315=210+28+25+2+1

所以 13151315 最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。

输入格式

一行一个正整数 nn。

输出格式

符合约定的 nn 的 0, 20,2 表示(在表示中不能有空格)。

输入输出样例

输入#1

1315

输出#1

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入#2

1

输出#2

2(0)

数据范围

对于 100\%100% 的数据,1 \le n \le 2 \times {10}^41≤n≤2×104。

解题思路

看到这道题,大家的思路一般都是递归吧。

就是把n分成一个多项式。然后又把每一项的幂次再分成一个多项式,那么判定终止条件是什莫呢?我们在分解的时候只要n等于0了,就代表这一项不能再继续分解为多项式了,对于任意一项,它的幂次要么是0、1、2,1的话是可以省略的,所以最终的表达式就只有0和2了,所以我们在分解幂次的时候判定条件是他要大于2,我的代码里面i就代表这一项的幂次,i>2,分解i,<=2的时候就输出,输出时再判定一下i是否等于1,不等于就输出i,等于就直接下一项。在输出格式的时候也要注意i和n的大小,n等于0就代表这一个多项式分解到头了,结尾的时候不应该加上“+”,i=1的话,就代表1这个幂次要被省略,开头和结尾不应该带“()”,说的有点乱,总的就是把,系数和幂次都分解为多项式,多项式的规定就是幂次只能为0、1、2,1要省略,和格式要求,题不难,那就是要有耐心。

代码

import java.util.Scanner;public class 幂次方 {static int n;public static void main(String[] args) {Scanner sc=new Scanner(System.in);n=sc.nextInt();f(n);}private static void f(int n) {int m=1,i=0;while(mn) {i--;n-=(m/2);}else {n-=m;}if(i!=1) {System.out.print("2(");}else {System.out.print("2");}if(i>2) {f(i);}else {if(i!=1) {System.out.print(i);}}if(i!=1) {if(n!=0) {System.out.print(")+");}else {System.out.print(")");}}else {if(n!=0) System.out.print("+");}if(n>0) {f(n);}}}