题目链接

 

The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=89, is a ninth power.

How many n-digit positive integers exist which are also an nth power?

这个题目有点坑:

先说自己的思路<虽然方法不是很好>

 

根据题意可知道:

a的b次方 除以 最小的b位数(如:1,10,100,1000) 的商 在 1--9之间,则:a的b次方就是符合题意的

 

然后就根据这个遍历

先找到第一个数符合条件的数firstnum

再找到第一个符合条件之后的第一个不满足条件的数nextnum

则:这中间有 nextnum - firstnum个数

 

当b也就是次方数大于18的时候,Long都溢出了

此时:有46个数

下面是程序 :

 1 package project61;
 2 
 3 import java.math.BigInteger;
 4 
 5 public class P63{
 6 //    a的b次方是b位数
 7 //    a的b次方 除以 b位的第一个数(如:1000) 商 在1 - 9之间
 8 //    以a为开始,找到第一个满足条件的数,如不存在返回 0 
 9 //    满足条件的数是连续的
10     long findFirst(long Base,int exp){
11         long res =(long) Math.pow(Base, exp);
12         long d = 1;
13         int Max_Cycle = 10000;
14         int texp = exp;
15         while(exp!=1){
16             d = d*10;
17             exp--;
18         }
19         boolean flag = true ;
20         int quot = 0;
21         while(Max_Cycle!=0){
22             quot = (int) (res/d);
23 //            System.out.println(quot+"res:"+res+" Base:"+Base+" d:"+d);
24             if(quot>=1 && quot<=9){
25                 return Base;
26             }
27             Base = Base + 1;
28             res = (long) Math.pow(Base, texp);
29             Max_Cycle--;
30         }
31         return 0 ;
32     }
33     
34     long findNext(long Base,int exp){
35         long res =(long) Math.pow(Base, exp);
36         long d = 1;
37         int Max_Cycle = 100000;
38         int texp = exp;
39         while(exp!=1){
40             d = d*10;
41             exp--;
42         }
43         boolean flag = true ;
44         int quot = 0;
45         while(Max_Cycle!=0){
46             quot = (int) (res/d);
47             System.out.println("商:"+quot +" 被除数:"+ res+" 除数:"+d+" 底数:"+Base+" 指数:"+texp);
48             if(quot==0 ||quot>9){
49                 
50                 return Base;
51             }
52             Base = Base + 1;
53             res = (long) Math.pow(Base, texp);
54             Max_Cycle--;
55         }
56         return 0 ;
57     }
58     void run(){
59         long result = 0;
60         int base = 1;
61         int exp = 1;
62 
63         while(exp<=18){
64             base = 1 ;
65             long firstNum = findFirst(base,exp);
66             if(firstNum !=0){
67             
68             long next = findNext(firstNum,exp);
69             System.out.println("第一个满足条件的底数:"+firstNum +" 第一个不满足条件的底数: "+ next);
70             result = result + next - firstNum;
71             
72             }
73             exp++;
74         }
75         System.out.println(result);
76     }
77     
78     public static void main(String[] args){
79         long begin= System.currentTimeMillis();
80         new P63().run(); 
81         long end = System.currentTimeMillis();
82         long Time = end - begin;
83         System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");
84     }
85 }
View Code

相关文章: