首页 > 其他分享 >实验1-2

实验1-2

时间:2023-11-23 19:11:06浏览次数:41  
标签:12 int 个数 因子 循环 实验 dp

实验1-2

如题:

思路:

使用动态规划的思想(DP思路,即一个大一点规模的问题可以被拆解为更小的,更容易解决的问题)

首先,定义一个数组 dp,用来存储每个数的分解式个数。 dp[i] 表示当前数 i 的不同分解式的个数。

接下来,从数 2 开始循环,逐个计算每个数的分解式个数。dp[i] = 0,防止数组越界。

然后,通过枚举当前数的所有因子来计算分解式个数。使用一个内部循环,从因子

j = 1 开始,一直到 i/2(因为因子的最大可能值是 i/2)。对于每个因子 j,计算

i % j == 0。如果是整除关系,说明 j 是 i 的一个因子。

在这种情况下,我们根据递推公式 dp[i] += dp[j] 来计算当前数的分解式个数。dp[j] 表示之前计算的拥有因子 j 的数的分解式个数。

根据递推公式,我们将之前计算的结果 dp[j] 累加到 dp[i] 上。这样就实现了动态规划的思想,利用已知的结果计算新的结果。

最后,循环结束后,返回数组 dp[n] 的值,即正整数 n 的不同分解式的个数。

代码:

以n=12,

第十一次循环(i = 12):

  • dp[12] = 0
  • 内层循环(j = 1):12 % 1 == 0,所以 dp[12] += dp[1] = 0 + 1 = 1
  • 内层循环(j = 2):12 % 2 == 0,所以 dp[12] += dp[2] = 1 + 1 = 2
  • 内层循环(j = 3):12 % 3 == 0,所以 dp[12] += dp[3] = 2 + 1 = 3
  • 内层循环(j = 4):12 % 4 == 0,所以 dp[12] += dp[4] = 3 + 2 = 5
  • 内层循环(j = 5):12 % 5 != 0,跳过
  • 内层循环(j = 6):12 % 6 == 0,所以 dp[12] += dp[6] = 5 + 3 = 8
  • 内层循环完毕
  • dp[12] = 8
#include<stdio.h>

int countSum(int n){

    int dp[n+1]; //存储每个数的分解式个数
    dp[1] = 1;  // 输入 1 的时候为 1

    for(int i = 2; i <= n; i++){
        dp[i] = 0;  //用 dp[j] 计算 dp[i]
        
        for(int j = 1; j <= i/2; j++){ //因子的最大可能值是 i/2, 题目意思防止 1*12,,12*1
            if(i % j == 0){           //整除关系,说明 j 是 i 的一个因子
                                      //dp[i] 则是待计算的当前数 i 的分解式个数, dp[j] 表示之前计算的拥有因子 j 的数的分解式个数
                dp[i] += dp[j];      //一个数的分解式个数等于因子的分解式个数之和
            }
        }
    }
    
    return dp[n];
}

int main(){

    int n;
    scanf("%d", &n);

    int count = countSum(n);
    printf("%d", count);

    return 0;

}

很好,随机测试几个数,没啥问题,复制粘贴

好好好

最后一个测试点超时

做出一些修改

j 因子的范围从1到 i/2 改为2到 根号i

j 因子,对应的因子 i/j( !=j ),并将两个因子的分解式个数都累加到dp[i]中

    for(int i = 2; i <= n; i++){
        dp[i] = 1;  //用 dp[j] 计算 dp[i]
        int limit = sqrt(i);

        for(int j = 2; j <= limit; j++){ //因子的最大可能值是根号 i
            if(i % j == 0){           //整除关系,说明 j 是 i 的一个因子
                                      //dp[i] 则是待计算的当前数 i 的分解式个数, dp[j] 表示之前计算的拥有因子 j 的数的分解式个数
                int other_factor = i / j;
                dp[i] += dp[j];
                if(other_factor != j){    //因子 i/j(!=j),将两个因子的分解式个数都累加到dp[i]中
                    dp[i] += dp[other_factor];
                }
            }
        }
    }

n的取值越大还是耗时小高,但是过了所有测试点


使用递归

#include <stdio.h>

int total = 0;

void solve(int n) {
    if (n == 1)
        total++;
    else {
        for (int i = 2; i <= n; i++)
            if (n % i == 0)
                solve(n / i);
    }
}

int main() {
    int n;
    scanf("%ld", &n);

    solve(n);

    printf("%d", total);

    return 0;
}

标签:12,int,个数,因子,循环,实验,dp
From: https://www.cnblogs.com/kirei7/p/17852272.html

相关文章

  • 11.23实验19
    实验19:中介者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解中介者模式的动机,掌握该模式的结构;2、能够利用中介者模式解决实际问题。[实验任务一]:虚拟聊天室在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:1.新的具体聊天室中......
  • 11.23实验20
    实验20:备忘录模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。[实验任务一]:多次撤销改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数......
  • 【linux上机实验】实验七 Linux开发工具的使用(二)(持续更新中)
    1.使用gdb调试下列程序,练习gdb命令。#include<stdio.h>#include<string.h>#include<stdlib.h>voidmy_print(char*string){printf("Thestringis\"%s\"\n",string);}voidmy_print2(char*string){ char*string2; intsize......
  • 24-1 IRF(华三堆叠实验)
    拓扑堆叠配置S6850_1配置[S6850_1]inteTen-GigabitEthernet1/0/49[S6850_1-Ten-GigabitEthernet1/0/49]shutdown[S6850_1-Ten-GigabitEthernet1/0/49]intete1/0/50[S6850_1-Ten-GigabitEthernet1/0/50]shutdown[S6850_1]irf-port1/2[S6850_1-irf-port1/2]portgroup......
  • 高飞实验16和17
    packageshiyan16;publicabstractclassAbstractCommand{publicabstractintexecute(intvalue);publicabstractintundo();}AbstractCommandpackageshiyan16;publicclassAdder{privateintnum=0;......
  • 【linux上机实验】实验六 Linux开发工具的使用
    【前言】愿,所有相遇,都恰逢其时!愿,此刻心头,正满怀欣喜!---你好,朋友,欢迎你!1.用gcc带不同参数编译下列hello.c程序。#include<stdio.h>intmain(){ printf(”HelloWorld!\n”); return0;}(1)只作预处理,不进行编译,相应命令为:gcc-Ehello.c(2)只进行......
  • 实验2 C语言分支与循环基础应用编程
    实验任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN24658intmain(){9intnumber;10inti;11srand(time(0));12for(i=0;i<N;++i){13nu......
  • DS18B20温度传感器——51实验
    DS18B20是由DALLAS半导体公司推出的一种“一线总线(单总线)”接口的温度传感器。与传统的热敏申阻等测温元件相比,它是一种新型的体积小,适用电压宽、与微处理器接口简单的数字化温度传感器。 具有如下特点:1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。......
  • 51单片机实验2:静态数码管
    数码管介绍共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极的数码管,共阳极数码管在应用时将公共端接到+5V。共阴极数码管是指将所有发光二极管的阳极接到一起形成公共阴极的数码管,共阴极数码管在应用时将公共端接到GND。硬件设计74HC138译码器管脚说明真值表(低电平有......
  • nginx+keepalived+http高可用和负载均衡:(实验)
    1.先NGINX负载均衡(2台)一模一样,客户端设置域名解析,负载均衡器的名称www.web.com YJ.li容器 数据库 自动化 网站架构 管理Nginx-keepalived+Nginx实现高可用集群 Keepalived+Nginx高可用集群(主从模式)#集群架构图:说明:Keepalived机器同样是nginx......