hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1403|回复: 9

求形如 2^r*3^s*5^t 的整数序列

[复制链接]

481

主题

481

帖子

1465

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1465
发表于 2024-2-25 23:09:28 | 显示全部楼层 |阅读模式
求前 200 项可表示成 $2^r*3^s*5^t$ (r,s,t 均为整数)的自然数序列。
    请证明:以上序列最大值小于 $2^30$; 请用 C / C++ 语言编程输出该序列,要求算法的空间及时间复杂度尽可能地低。

附注:可解除须 C / C++ 的限定,欢迎大家用自己熟悉的计算机语言提交代码。
回复

使用道具 举报

0

主题

186

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-25 23:10:20 | 显示全部楼层
两年前我给公司面试题库出了几道算法题,但迄今几乎无人可正确作答,
上述题目是在某面试题基础上再升级的,难度有所提高,因为咱们论坛里高手多。
回复

使用道具 举报

0

主题

220

帖子

86

积分

关内侯

Rank: 2

积分
86
发表于 2024-2-25 23:10:32 | 显示全部楼层
假设r\s\t是正整数,那么这个数必然是2*3*5=30的倍数,然后乘以2/4/8/16/32/.............
3/9/27/................
5/25/125.............
回复

使用道具 举报

0

主题

166

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-25 23:11:28 | 显示全部楼层
(r+1)*(s+1)*(t+1)<=200
回复

使用道具 举报

1

主题

207

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2024-2-25 23:11:39 | 显示全部楼层
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32,
36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100, 108,
120, 125, 128, 135, 144, 150, 160, 162, 180, 192, 200, 216, 225, 240,
243, 250, 256, 270, 288, 300, 320, 324, 360, 375, 384, 400, 405, 432,
450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675, 720, 729,
750, 768, 800, 810, 864, 900, 960, 972, 1000, 1024, 1080, 1125, 1152,
1200, 1215, 1250, 1280, 1296, 1350, 1440, 1458, 1500, 1536, 1600,
1620, 1728, 1800, 1875, 1920, 1944, 2000, 2025, 2048, 2160, 2187,
2250, 2304, 2400, 2430, 2500, 2560, 2592, 2700, 2880, 2916, 3000,
3072, 3125, 3200, 3240, 3375, 3456, 3600, 3645, 3750, 3840, 3888,
4000, 4050, 4096, 4320, 4374, 4500, 4608, 4800, 4860, 5000, 5120,
5184, 5400, 5625, 5760, 5832, 6000, 6075, 6144, 6250, 6400, 6480,
6561, 6750, 6912, 7200, 7290, 7500, 7680, 7776, 8000, 8100, 8192,
8640, 8748, 9000, 9216, 9375, 9600, 9720, 10000, 10125, 10240, 10368,
10800, 10935, 11250, 11520, 11664, 12000, 12150, 12288, 12500, 12800,
12960, 13122, 13500, 13824, 14400, 14580, 15000, 15360, 15552, 15625,
16000, 16200
是这些数吗?如果r\s\t可以是零的话
回复

使用道具 举报

0

主题

181

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-25 23:12:34 | 显示全部楼层
如果是为了证明第1问,
则基本上踩在点子上了,
即构造一整数 $2^r*3^s*5^t < 2^30$, 且满足 $(r+1)(s+1)(t+1)>=200$ 即可。

比如:$2^6*3^6*5^6 = 30^6 < 32^6 = 2^30$,而 $7^3 = 343 > 200$。

此问的目的,仅仅提示:在用32位系统下,所求序列选用 int 型数据类型足矣(不会溢出;即:无需大整数运算)。
回复

使用道具 举报

0

主题

156

帖子

125

积分

关内侯

Rank: 2

积分
125
发表于 2024-2-25 23:12:49 | 显示全部楼层
如果rst必须大于零,那么是
30, 60, 90, 120, 150, 180, 240, 270, 300, 360, 450, 480, 540, 600,
720, 750, 810, 900, 960, 1080, 1200, 1350, 1440, 1500, 1620, 1800,
1920, 2160, 2250, 2400, 2430, 2700, 2880, 3000, 3240, 3600, 3750,
3840, 4050, 4320, 4500, 4800, 4860, 5400, 5760, 6000, 6480, 6750,
7200, 7290, 7500, 7680, 8100, 8640, 9000, 9600, 9720, 10800, 11250,
11520, 12000, 12150, 12960, 13500, 14400, 14580, 15000, 15360, 16200,
17280, 18000, 18750, 19200, 19440, 20250, 21600, 21870, 22500, 23040,
24000, 24300, 25920, 27000, 28800, 29160, 30000, 30720, 32400, 33750,
34560, 36000, 36450, 37500, 38400, 38880, 40500, 43200, 43740, 45000,
46080, 48000, 48600, 51840, 54000, 56250, 57600, 58320, 60000, 60750,
61440, 64800, 65610, 67500, 69120, 72000, 72900, 75000, 76800, 77760,
81000, 86400, 87480, 90000, 92160, 93750, 96000, 97200, 101250,
103680, 108000, 109350, 112500, 115200, 116640, 120000, 121500,
122880, 129600, 131220, 135000, 138240, 144000, 145800, 150000,
153600, 155520, 162000, 168750, 172800, 174960, 180000, 182250,
184320, 187500, 192000, 194400, 196830, 202500, 207360, 216000,
218700, 225000, 230400, 233280, 240000, 243000, 245760, 259200,
262440, 270000, 276480, 281250, 288000, 291600, 300000, 303750,
307200, 311040, 324000, 328050, 337500, 345600, 349920, 360000,
364500, 368640, 375000, 384000, 388800, 393660, 405000, 414720,
432000, 437400, 450000, 460800, 466560, 468750, 480000, 486000
回复

使用道具 举报

0

主题

200

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2024-2-25 23:13:43 | 显示全部楼层
  1. (*求前200个2/3/5的幂的整数*)Clear["Global`*"];(*Clear all variables*)fun[n0_]:=Module[{n=n0,s2,s3,s5,out},                 s2=0;While[Mod[n,2]==0,s2=s2+1;n=n/2];(*不断地除以2*)                 s3=0;While[Mod[n,3]==0,s3=s3+1;n=n/3];(*不断地除以3*)                 s5=0;While[Mod[n,5]==0,s5=s5+1;n=n/5];(*不断地除以5*)                 (*如果正好只是2/3/5的倍数,则n应该=1*)                 If[n==1,out=1,out=0];                 out                ]Select[Range@500000,fun[#]==1&][[1;;200]]
复制代码
回复

使用道具 举报

0

主题

200

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2024-2-25 23:14:02 | 显示全部楼层
在 6# 里,我只是随便构造了一个数来证明。

请你帮忙找一下:$2^32$ 以内,序列里素因子数目最多的那个数是哪个?
即:$n=2^r*3^s*5^t < 2^32$ 且使 $(r+1)(s+1)(t+1)$ 最大?
回复

使用道具 举报

0

主题

181

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-25 23:14:56 | 显示全部楼层
  1. #include <iostream>using namespace std;int myfun(long n);int main(){        int k=0;//用来计算到底有多少个满足条件的整数        //先取一个较大的上限,如果满足条件,自动中断循环    for (long i=1;i<=800000;i++)    {                if (myfun(i)==1)                {                        printf("%d\n",i);                        k++;                }                if (k>=200)                {                        break;                }    }        return 0;}//子函数,用来判定整数是否满足要求,如果满足要求则返回1,如果不满足x则返回0int myfun(long n){        int out;        while (n%2==0) { n=n/2; }        while (n%3==0) { n=n/3; }        while (n%5==0) { n=n/5; }        //如果只可能含有2/3/5因数,那么n最后应该等于1        if (n==1)        {                out=1;        }         else        {                out=0;        }        return out;}
复制代码
上面是我写的c++代码,结果和上面应该一样,一两秒钟就能搞定了,c++的效率挺高的!
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 03:46 , Processed in 0.068392 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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