首页 > 其他分享 >西农OJ P1067 Humble Number

西农OJ P1067 Humble Number

时间:2023-08-20 16:23:03浏览次数:33  
标签:西农 factors int Humble Number pos min

1067: Humble Number

题目描述

如果一个数只有素数因子2,3,5,7,那么这个数被称为“Humble Number”。前20个“Humble Number”是:1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,25,27。经验证,2000000000以内的“Humble Number”共有5842个。
你的任务是编写一个程序,根据要求输出序列中的某一个数。

如 22, 不能拆解为2a+3b+5c+7d=22, 因此22不是“Humble Number”

输入

输入数据是一列整数,每行一个,表示要求输出的数再“Humble Number”序列中的序数,输入的结束是一个数字0,这个数字不作处理。

输出

对于每一个输入的数字,输出“Humble Number”数列中相应位置的数字,每个数字占一行。

样例输入

1
2
3
4
11
12
13
21
22
23
100
1000
5842
0

样例输出

1
2
3
4
12
14
15
28
30
32
450
385875
2000000000

思路

最容易想到就是枚举法, 从1开始, 判断每一个数是否为“Humble Number”, 是的话存入数组中. 这样做会有一个问题, 就是越往后, 无效的运算越多. 当数字较大时, “Humble Number”的分布是十分稀疏的.

将问题转化为, 直接生成“Humble Number”, 计算量会少很多.“Humble Number”可以分解为另一个“Humble Number”乘以基数"2,3,5,7"之一. 因此可以从最小的“Humble Number” 1 开始推.

  • 设一个基数数组 factors[4] =

  • 设一个Humble Number数组 num[5842] = {0}, num[0] = 1;

  • 维护一个位置数组pos[4] =

  • 计算公式 Humble Number (n) = min

    • min{ Humble Number (pos[i])*factors[i] }, 既保证了Humble Number数组从小到大排序, 又保证了不会出现重复的结果
  • 每算出一个新的Humble Number, 计算这个Humble Number时, min{ Humble Number (pos[i])*factors[i] } 中对应的pos后移一位

    • 如 pos = {0,0,0,0} 时, min{ Humble Number (pos[i])*factors[i] } = 2, 此时i=0, 就让pos[0] ++

代码

#include<stdio.h>
#define MAX_NUM 20000000
#define TABLE_LEN 5842

int main(void){
    int factors[4] = {2,3,5,7};
    int pos[4] = {0,0,0,0};
    int table[TABLE_LEN];
    table[0] = 1;
    int i;
    for(i = 1; i < TABLE_LEN; i++){
        int j = 0;
        int num[4] = {
            factors[0]*table[pos[0]],
            factors[1]*table[pos[1]],
            factors[2]*table[pos[2]],
            factors[3]*table[pos[3]]
        };
        int min = 0;
        min = num[min]<num[1]?min:1;
        min = num[min]<num[2]?min:2;
        min = num[min]<num[3]?min:3;
        if(table[i-1]!=num[min]){
            table[i] = num[min];
        }else{
            i--;
        }
        pos[min]++;
    }
    while(1){
        scanf("%d",&i);
        if(!i) break;
        printf("%d\n",table[i-1]);
    }    
    return 0;
}

补充

判断一个数是否为“Humble Number”

  • 将这个数除以2, 直到无法整除
  • 继续除以3, 直到无法整除
  • 继续除以5, 直到无法整除
  • 继续除以7, 直到无法整除

上述四步中, 若有一步出现完全整除, 则为“Humble Number”

标签:西农,factors,int,Humble,Number,pos,min
From: https://www.cnblogs.com/orzmiku/p/17644160.html

相关文章

  • 西农OJ P1005 装载问题
    装载问题问题描述有两艘船,载重量分别是c1、c2,n个集装箱,重量是wi(i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。输入多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi(i=1…n)。n等于0标志输入结束。......
  • 西农OJ P1491 城市电话号码
    题目描述某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是0-4位数字;前缀是以非0开头的3位数字,有效号码是4位数字,各部分之间用减号(-)分隔,地区码为空时地区码与前缀之间不包含分隔符。请编写函数检测输入号码num的有效性,若输入号码符合上述规定返回0,否则返回1。函......
  • CF1738C_EvenNumberAddicts
    CF1738CEvenNumberAddicts考虑综合只跟每个数的奇偶性有关,就先统计奇数个数及偶数个数。有DP和数学分类讨论两种方法。具体看题解吧:https://www.luogu.com.cn/problem/solution/CF1738C数学dp......
  • Oracle listagg() 和tow_number()
    listagg();多条数据合并某列数据listagg(role_name,'分割符')withingroup(orderby根据哪些字段排序) over(partitionby分组字段)row_number():根据某个字段分组并且取到每个类型时间最大的数据 a='1'意思是分组后取到第一条select*from(select......
  • 读取xls文件时报错 Initialisation of record 0x203(NumberRecord) left 4 bytes rema
    项目背景:公司的一个客户报告项目需要同步及抽取客户方的文件数据,文件类型为xls格式,文件为客户方的第三方厂商系统批量生成,工具及方法不明问题:读取该类xls文件后,无法成功创建Workbook,报错提示“Initialisationofrecord0x203(NumberRecord)left4bytesremainingstilltob......
  • IfcDayInMonthNumber
    IfcDayInMonthNumber类型定义IfcDayInMonthNumber是一个整数,用于定义指定日期在一个月中的位置。 类型:整数 IFC1.5.1中的新型。IFC4添加规则ValidRange的位置 FormalPropositionsRuleDescriptionValidRangeThevalidrangeforpositioningadayinamonth......
  • row_number()和rownum排序的区别
    在Oracle中使用ROW_NUMBER()和ROWNUM进行排序时,它们的性能可能会有一些差异。以下是它们之间的一些对比:ROW_NUMBER()排序:ROW_NUMBER()是一种窗口函数,可以为结果集中的每一行分配一个唯一的行号,并且可以根据指定的排序字段进行排序。ROW_NUMBER()函数通常在内部执行排序操作,然后为......
  • hive排序函数 rank、dense_rank、row_number
    rank函数:对有序序列编号,当排序字段取值相同时编号相同,且下一条取值不同记录的编号不连续。如序列为:13,13,13,13,13,14,…对应的排序编号为1,1,1,1,1,6,…dense_rank函数:对有序序列编号,当排序字段相同时编号相同,且下一条记录的编号仍连续。如序列为:13,13,13,13,13,14,…对应的排序......
  • sql row_number(),rank(),row_number()的区别
    第一个,row_nubmer(),这个排序函数的特点是相同数据,先查出的排名在前,没有重复值。像我们这里呢sal相同,先查出来的数据的rank排名优先。如下图:partitionby相当于分组查询第二个,rank()函数,是跳跃排序,相同数据(这里为sal列相同)排名相同,比如并列第1,则两行数据(这里为rank列)......
  • 排名函数rank、dense_rank、row_number
    rank():返回一个连续的排名值,相同的值将具有相同的排名,可能会有空缺。如果存在两个相同的值,则下一个排名与当前值的排名相同,并且下一个排名将相应地增加。使用场景:当需要按照某个特定的列对数据进行排序,但不需要为相同值分配连续的排名时,可以使用rank()函数。 dense_rank():返回......