鱼C论坛

 找回密码
 立即注册
查看: 3911|回复: 11

题目63:有多少n位正整数同时也是一个数的n次方?

[复制链接]
发表于 2015-8-7 22:03:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Powerful digit counts

The 5-digit number, QQ20150807-1@2x.png , is also a fifth power. Similarly, the 9-digit number, QQ20150807-2@2x.png , is a ninth power.

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

题目:

五位数 QQ20150807-1@2x.png 同时也是一个数的五次方。类似的,九位数 QQ20150807-2@2x.png ,同时也是一个数的九次方。

有多少 n 位正整数同时也是某个数的 n 次方?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-31 15:59:13 | 显示全部楼层
4 的2-2次方相等
5 的2-3次方相等
6 的2-4次方相等
7 的2-6次方相等
8 的2-10次方相等
9 的2-21次方相等
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-31 15:59:34 | 显示全部楼层
用大数算的 比较简单 不过不知道答案对没
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-16 00:38:29 | 显示全部楼层
这里,可以先数学分析一下:
如果使得某个数k的n次方是一个n位数,k显然必须小于10,且k^n>10^(n-1)
后面的不等式在取对数后,最终可化为
n<1/(1-log10(k)),当然,这里n是允许等于1的(即5的1次方是1位数,这是计数在内的)。
顺着这个思路,后面就很好写代码了。
将所有1次方计数在内,共49个。
  1. import math

  2. num=0
  3. for k in range(1,10):
  4.     temp = 1/(1-math.log10(k))
  5.     num+=int(temp)
  6. print(num)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-14 16:15:53 | 显示全部楼层
QingXin 发表于 2016-9-16 00:38
这里,可以先数学分析一下:
如果使得某个数k的n次方是一个n位数,k显然必须小于10,且k^n>10^(n-1)
后面 ...

楼上分析得很到位!
根据n<1/(1-log10(9)), 得到n需小于21.8
=> 49
  1. count = 0
  2. for n in range(1,22):
  3.         for k in range(1,10):
  4.                 if len(str(k**n)) == n:
  5.                         count += 1
  6. print (count)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-24 10:26:36 | 显示全部楼层
  1. count = 0
  2. for i in range(1,100):
  3.     for j in range(1,100):
  4.         if len(str(i**j))==j:
  5.             count +=1
  6. print(count)
复制代码

结果:49
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-20 16:38:07 | 显示全部楼层
  1. # encoding:utf-8
  2. # 一个n位数同时是一个数的n次方
  3. from time import time
  4. def euler063():
  5.     count = 0
  6.     for t in range(1,10):
  7.         for n in range(1,100):
  8.             tmp = t**n
  9.             if len(str(tmp)) == n:
  10.                 #print(t,n,tmp)
  11.                 count += 1
  12.             else:
  13.                 break
  14.     print(count)
  15. if __name__ == '__main__':
  16.     start = time()
  17.     euler063()
  18.     print('cost %.6f sec' % (time() - start))
复制代码

49
cost 0.000000 sec
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-18 10:20:10 | 显示全部楼层
此代码使用matlab编程
Problem63所用时间为: 0.27143秒
Problem63的答案为: 49
  1. %% Problem63.m
  2. % 最后编辑时间:17-06-17 23:35
  3. % 问题:有多少n位的正整数,也是某位数的n次方
  4. % 分析:底数小于10,指数小于22
  5. % Problem63所用时间为: 0.27143秒
  6. % Problem63的答案为: 49

  7. function Output = Problem63()
  8. tic
  9. Total = 0;
  10. for bb = 1:22
  11.     for aa = 1:9
  12.         if length(char(vpa(aa^bb))) - 2 == bb %去掉***.0的.0
  13.             Total = Total + 1;
  14.         end
  15.     end
  16. end

  17. Output = Total;
  18.                                     
  19. toc
  20. disp('此代码使用matlab编程')
  21. disp(['Problem63所用时间为: ',num2str(toc),'秒'])
  22. disp(['Problem63的答案为: ',num2str(Output)])
  23. end
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 12:57:14 | 显示全部楼层
本帖最后由 王小召 于 2019-6-28 12:58 编辑

共有:49 个
用时:0.2184014 秒
  1. ## 因为10**n 次方是n+1位,所以当底数大于10的时候无需继续进行下去(所以y 上限设为9即可)
  2. import time


  3. def cal():
  4.     result = []
  5.     for x in range(1, 1000):
  6.         for y in range(1, 10):
  7.             if len(str(y**x)) == x:
  8.                 result.append("{}(长度:{}) = {}^{}次方".format(y**x, len(str(y**x)), y, x))
  9.     return result
  10. result = cal()
  11. print("共有:{} 个\n用时:{} 秒".format(len(result), time.process_time()))
  12. # print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 08:57:40 | 显示全部楼层
49

Process returned 0 (0x0)   execution time : 0.025 s
Press any key to continue.
本楼其他大大说的已经很清楚,这里提供c++实现供参考
同时若数据范围较大,可预先计算上限从而进一步优化
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;

  4. int main(){
  5.   int cnt = 0;

  6.   for (int x = 1;x <= 9;x++){
  7.     for (int n = 1;n <= 21;n++){
  8.       if (n == (int)(n*log10(x) + 1)) cnt++;
  9.     }
  10.   }
  11.   cout << cnt << endl;
  12.   return 0;
  13. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
永恒的蓝色梦想 + 5 + 5 + 3 支持~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 12:00:37 From FishC Mobile | 显示全部楼层
直接把4#代码改编成C++
  1. #include<iostream>
  2. #include<cmath>



  3. int main() {
  4.     using namespace std;
  5.     ios::sync_with_stdio(false);

  6.     unsigned short n, count = 0;


  7.     for (n = 1; n < 10; n++) {
  8.         count += 1 / (1 - log10(n));
  9.     }


  10.     cout << count << endl;
  11.     return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-29 18:08:23 | 显示全部楼层
  1. import time as t
  2. import numpy as np

  3. start = t.perf_counter()
  4. upper_limit = int(1 / (1 - np.log10(9))) + 1
  5. count = 0
  6. for n in range(1, upper_limit):
  7.     for num in range(1, 10):
  8.         if len(str(num ** n)) == n:
  9.             count += 1

  10. print(count)
  11. print("It costs %f s" % (t.perf_counter() - start))
复制代码



49
It costs 0.000116 s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-20 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表