鱼C论坛

 找回密码
 立即注册
查看: 3552|回复: 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 次方?

想知道小甲鱼最近在做啥?请访问 -> 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次方相等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-31 15:59:34 | 显示全部楼层
用大数算的 比较简单 不过不知道答案对没
想知道小甲鱼最近在做啥?请访问 -> 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个。
import math

num=0
for k in range(1,10):
    temp = 1/(1-math.log10(k))
    num+=int(temp)
print(num)
想知道小甲鱼最近在做啥?请访问 -> 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
count = 0
for n in range(1,22):
        for k in range(1,10):
                if len(str(k**n)) == n:
                        count += 1
print (count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-24 10:26:36 | 显示全部楼层
count = 0
for i in range(1,100):
    for j in range(1,100):
        if len(str(i**j))==j:
            count +=1
print(count)
结果:49
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-20 16:38:07 | 显示全部楼层
# encoding:utf-8
# 一个n位数同时是一个数的n次方
from time import time
def euler063():
    count = 0
    for t in range(1,10):
        for n in range(1,100):
            tmp = t**n
            if len(str(tmp)) == n:
                #print(t,n,tmp)
                count += 1
            else:
                break
    print(count)
if __name__ == '__main__':
    start = time() 
    euler063()
    print('cost %.6f sec' % (time() - start))
49
cost 0.000000 sec
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

function Output = Problem63()
tic
Total = 0;
for bb = 1:22
    for aa = 1:9
        if length(char(vpa(aa^bb))) - 2 == bb %去掉***.0的.0
            Total = Total + 1;
        end
    end
end

Output = Total;
                                     
toc
disp('此代码使用matlab编程')
disp(['Problem63所用时间为: ',num2str(toc),'秒'])
disp(['Problem63的答案为: ',num2str(Output)])
end
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


def cal():
    result = []
    for x in range(1, 1000):
        for y in range(1, 10):
            if len(str(y**x)) == x:
                result.append("{}(长度:{}) = {}^{}次方".format(y**x, len(str(y**x)), y, x))
    return result
result = cal()
print("共有:{} 个\n用时:{} 秒".format(len(result), time.process_time()))
# print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main(){
  int cnt = 0;

  for (int x = 1;x <= 9;x++){
    for (int n = 1;n <= 21;n++){
      if (n == (int)(n*log10(x) + 1)) cnt++;
    }
  }
  cout << cnt << endl;
  return 0;
}

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



int main() {
    using namespace std;
    ios::sync_with_stdio(false);

    unsigned short n, count = 0;


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


    cout << count << endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

print(count)
print("It costs %f s" % (t.perf_counter() - start))


49
It costs 0.000116 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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