鱼C论坛

 找回密码
 立即注册
查看: 3795|回复: 19

题目29:a的b次方(2≤a,b≤100)中共有多少个不同的数?

[复制链接]
发表于 2015-4-23 23:20:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 欧拉计划 于 2023-10-18 02:14 编辑
Distinct powers

Consider all integer combinations of a、b for BaiduShurufa_2015-4-23_23-14-25.png :

BaiduShurufa_2015-4-23_23-10-34.png

If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms:

4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

How many distinct terms are in the sequence generated by BaiduShurufa_2015-4-23_23-11-56.png ?

题目:

考虑 BaiduShurufa_2015-4-23_23-14-25.png 下的所有整数组合:

BaiduShurufa_2015-4-23_23-10-34.png

如果将这些数字排序,并去除重复的,我们得到如下 15 个数字的序列:

4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

BaiduShurufa_2015-4-23_23-11-56.png 下生成的序列中有多少个不同的项?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-29 16:19:24 | 显示全部楼层
9801项
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <iterator>
  5. #include <algorithm>
  6. using namespace std;

  7. /* 结果容器 */
  8. std::vector<string> myResult;
  9. string Multiply(string s,int x)  //大数乘以整形数  
  10. {  
  11.         reverse(s.begin(),s.end());  
  12.         int cmp=0;  
  13.         for(int i=0;i<s.size();i++)  
  14.         {  
  15.                 cmp=(s[i]-'0')*x+cmp;  
  16.                 s[i]=(cmp%10+'0');  
  17.                 cmp/=10;  
  18.         }  
  19.         while(cmp)  
  20.         {  
  21.                 s+=(cmp%10+'0');  
  22.                 cmp/=10;  
  23.         }  
  24.         reverse(s.begin(),s.end());  
  25.         return s;  
  26. }  
  27. /* 求a的b次方 大数 */
  28. string calc(int a,int b)
  29. {
  30.         string g("1");
  31.        

  32.         for (int z = 1; z<=b;z++)
  33.         {
  34.                  
  35.                 g=Multiply(g,a);
  36.         }
  37.        
  38.         return g;
  39. }
  40. int main()
  41. {
  42.         for (int a=2;a<=100;a++)
  43.         {
  44.                 for (int b=2;b<=100;b++)
  45.                 {
  46.                         myResult.push_back(calc(a,b));
  47.                 }
  48.         }
  49.         std::cout<<myResult.size()<<endl;

  50.         //去除重复
  51.         unique(myResult.begin(),myResult.end());
  52.         std::cout<<myResult.size()<<endl;
  53.         return 0;
  54.        
  55. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-1 16:18:29 | 显示全部楼层
  1. list1 = []
  2. for i in range(2,101):
  3.       for j in range(2,101):
  4.             temp = i**j
  5.             if temp not in list1:
  6.                   list1.append(temp)

  7. print(len(list1))
复制代码

得到的结果是9183
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-1 16:20:17 | 显示全部楼层

没有去掉重复的项
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-21 20:58:29 | 显示全部楼层
  1. 9183
  2. [Finished in 0.2s]

  3. lst = []
  4. for a in range(2,101):
  5.         for b in range(2,101):
  6.                 lst.append (a**b)
  7. lst = set(lst)
  8. print (len(lst))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-23 20:09:57 | 显示全部楼层
此代码使用matlab编程
Problem29所用时间为0.042795秒
Problem29的答案为9183
  1. %% Problem29
  2. %题目29:a的b次方(2≤a,b≤100)中共有多少个不同的数?
  3. function Output=Problem29(Input)
  4.   tic
  5. if nargin==0
  6. Input=100;
  7. end
  8. Total=(Input-1)^2;%总数有99*99个数
  9. Sum=0;%出现多余数的数量
  10. %现去掉多余的数
  11. Rank2=2:100;%关于2 4 8 16 32 64
  12. for ii=2:6
  13.     Temp=ii*2:ii:ii*100;
  14.     Rank2=union(Rank2,Temp);
  15. end
  16. Sum2=length(Rank2);
  17. Rank3=2:100;%关于3 9 27 81
  18. for ii=2:4
  19.     Temp=ii*2:ii:ii*100;
  20.     Rank3=union(Rank3,Temp);
  21. end
  22. Sum3=length(Rank3);
  23. % 关于 5 25,6 36 ,7 49, 10 100
  24. Sum_Other=(99+50)*4;
  25. disp(Sum)
  26. Output=Total-18*99+Sum2+Sum3+Sum_Other;                     
  27. disp('此代码使用matlab编程')
  28. disp(['Problem29所用时间为',num2str(toc),'秒'])
  29. disp(['Problem29的答案为',num2str(Output)])

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

使用道具 举报

发表于 2017-3-2 13:44:31 | 显示全部楼层
  1. >>> len(set([x**y for x in range(2,101)for y in range(2,101)]))
  2. 9183
  3. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-18 22:03:23 | 显示全部楼层
  1. list1=[]
  2. for a in range(2,101):
  3.     for b in range(2,101):
  4.         list1.append(a**b)
  5. print(len(set(list1)))
复制代码

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

使用道具 举报

发表于 2018-7-29 08:42:40 | 显示全部楼层
  1. public class DistinctPowers{
  2.         public static void main(String[] args){       
  3.                 int count = 0;
  4.                 double[] result = new double[10000];
  5.                 double n = 0;
  6.                 for(int a = 2;a <= 100;a ++){
  7.                         for(int b = 2;b <= 100;b ++){
  8.                                 n = Math.pow(a,b);
  9.                                 if(distinct(n,result,count)){
  10.                                         result[count++] = n;
  11.                                 }
  12.                         }
  13.                 }
  14.                 System.out.println(count);
  15.         }
  16.         public static boolean distinct(double n,double[] result,int count){
  17.                 boolean flag = true;
  18.                 for(int i = 0;i < count;i ++){
  19.                         if(result[i] == n){
  20.                                 flag =false;
  21.                         }
  22.                 }
  23.                 return flag;
  24.         }
  25. }
复制代码

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

使用道具 举报

发表于 2019-3-23 22:54:18 | 显示全部楼层
都是大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-12 14:18:27 | 显示全部楼层
用时:0.1404009秒
a**b共有:9183 个不同值

import time

def get_result(n):
    result = []
    for a in range(2, n+1):
        for b in range(2, n+1):
            result.append(a**b)
    return result

print("用时:{}秒\na**b共有:{} 个不同值".format(time.process_time(), len(list(set(get_result(100))))))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-22 20:39:27 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-19 10:46 编辑
  1. from sys import stdout
  2. stdout.write({a**b for a in range(2,101)for b in range(2,101)}.__len__().__str__())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-17 11:32:19 | 显示全部楼层
直接用集合就行了呀
9183
  1. array = set()

  2. for i in range(2, 100 + 1):
  3.     for j in range(2, 100 + 1):
  4.         array.add(i ** j)

  5. print(len(array))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-14 20:44:59 | 显示全部楼层
  1. #include<iostream>
  2. #include<cmath>
  3. #include<set>
  4. using namespace std;


  5. int main() {
  6.     ios::sync_with_stdio(false);
  7.     set<double>vals;
  8.     unsigned char i, j;

  9.     for (i = 2; i <= 100; ++i) {
  10.         for (j = 2; j <= 100; ++j) {
  11.             vals.insert(pow(i, j));
  12.         }
  13.     }

  14.     cout << vals.size() << endl;
  15.     return 0;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 17:06:01 | 显示全部楼层
9183

Process returned 0 (0x0)   execution time : 0.032 s
Press any key to continue.
参考http://www.cnblogs.com/WArobot的做法
思路:将底数化为最小底数(例如16=2*2*2*2,则16的最小底数为2),把幂化为最小底数的幂,用二维数组判重
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;

  4. const int M = 100;
  5. const int M_EXP = 600;
  6. int min_base[M+5] = {0};
  7. int exp[M+5] = {0};

  8. void ini_min_base(){
  9.   for (int i = 2;i <= M;i++){
  10.     if (min_base[i])  continue;
  11.     min_base[i] = i;
  12.     int p = 0;  //指数变量
  13.     for (int j = i;j <= M;j *=i){
  14.       min_base[j] = i;
  15.       exp[j] = ++p;
  16.     }
  17.   }
  18. }

  19. int main(){
  20.   int cnt = 0;
  21.   int vis[M+5][M_EXP] = {0};
  22.   ini_min_base();

  23.   for (int a = 2;a <= M;a++){
  24.     for (int b = 2;b <= M;b++){
  25.       int a1 = min_base[a];
  26.       int b1 = b * exp[a];
  27.       if (!vis[a1][b1]) vis[a1][b1] = 1;
  28.       //printf("%d %d %d\n",a1,b1,vis[a1][b1]);
  29.     }
  30.   }
  31.   for (int i = 0;i < M+5;i++)
  32.     for (int j = 0;j < M_EXP;j++) cnt += vis[i][j];
  33.   cout << cnt << endl;
  34.   return 0;
  35. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-22 10:56:47 | 显示全部楼层
  1. start = time.time()

  2. list = []
  3. for a in range(2,101):
  4.         for b in range(2,101):
  5.                 if a**b not in list:
  6.                         list.append(a**b)

  7. print("共有%d个不同的项" %len(list))

  8. end = time.time()
  9. print("共用时%f秒" %(end - start))
复制代码


共有9183个不同的项
共用时0.449894秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 18:06:51 | 显示全部楼层
用python做这种大数计算就太简单了,觉得自己编程能力不错的可以用C语言试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 22:17:39 | 显示全部楼层
本帖最后由 guosl 于 2022-1-2 22:21 编辑

这题不要被很大的次方吓坏了,双精度浮点数足够处理。
  1. /*
  2. 答案:9183
  3. 耗时:0.0012099秒
  4. */
  5. #include <iostream>
  6. #include <cmath>
  7. #include <vector>
  8. #include <algorithm>
  9. using namespace std;

  10. int main(void)
  11. {
  12.   vector<double> v;
  13.   for (int a = 2; a <= 100; ++a)
  14.   {
  15.     for (int b = 2; b <= 100; ++b)
  16.     {
  17.       double d = pow(double(a), double(b));
  18.       v.push_back(d);
  19.     }
  20.   }
  21.   sort(v.begin(), v.end());
  22.   auto itr = unique(v.begin(), v.end());
  23.   int k = int(itr - v.begin());
  24.   cout << k << endl;
  25.   return 0;
  26. }
复制代码

我看了前面的一些代码,许多人使用了set,其实这不是最优的,因为set的内部存储机制其实是一颗红黑树,每次插入都会引起树的重排,非常耗费时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-8 12:57:49 | 显示全部楼层
  1. use rayon::prelude::*;
  2. use num::bigint::ToBigUint;
  3. use std::time::Instant;
  4. use std::collections::BTreeSet;

  5. fn main() {
  6.     let now = Instant::now();
  7.     let mut set = BTreeSet::new();
  8.     let num = (2..101u32)
  9.         .into_par_iter()
  10.         .map(|a| {
  11.             let a = a.to_biguint().unwrap();
  12.             (2..101u32)
  13.                 .into_par_iter()
  14.                 .map(|b| a.pow(b))
  15.                 .collect::<Vec<_>>()  
  16.         })
  17.         .collect::<Vec<_>>();
  18.     for i in num {
  19.         for j in i {
  20.             set.insert(j);
  21.         }
  22.     }
  23.     println!("cost {}ms.", now.elapsed().as_millis());
  24.     println!("{}", set.len())
  25. }
复制代码

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

使用道具 举报

发表于 2023-1-13 19:49:06 | 显示全部楼层
python
100根本测不到时间
9183
Time:0.0s
设置上限为1000
977358
Time:0.0029997825622558594s
时间复杂度应该是O(M*log(M))
  1. import math
  2. import time
  3. st=time.time()
  4. M=1000
  5. # 同底去重,同底一定重复,不同底一定不会重复
  6. al=list(range(M+1))
  7. al[1]=0
  8. nl=list()
  9. n0=int(math.log(M)/math.log(2))
  10. nl=[0]*n0
  11. for a in al:
  12.     if not a==0:
  13.         i=1
  14.         while a**i<=M:
  15.             al[a**i]=0
  16.             i=i+1
  17.         # print((a,i))
  18.         nl[i-2]=nl[i-2]+1

  19. # a=a0**n; a**b=a0**(n*b) 转化为n*b有多少个,而且不会有大数
  20. nbS=set()
  21. num=0
  22. nnum=0
  23. for n in range(1,n0+1):
  24.     # print(n)
  25.     for b in range(2,M+1):
  26.         if n*b not in nbS:
  27.             nbS.add(n*b)
  28.             num=num+1
  29.     nnum=nnum+num*nl[n-1]
  30. print(nnum)
  31. print('Time:{}s'.format(time.time()-st))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 22:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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