C语言数学问题与简单DP01背包问题详解

C语言数学问题与简单DP01背包问题详解

数学问题

在C语言中,常见的数学问题包括但不限于:

  • 求最大公约数和最小公倍数
  • 求整数平方根
  • 判断一个数是否为质数
  • 求某个数的阶乘
  • 求组合数和排列数

下面我们将对这些问题逐一进行讲解。

求最大公约数和最小公倍数

最大公约数和最小公倍数是数学中非常常见的概念,在C语言中可以通过辗转相除法等算法来进行求解。以下是求最大公约数和最小公倍数的程序示例:

#include <stdio.h>

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    } else {
        return gcd(b, a % b);
    }
}

int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

int main() {
    int a, b;
    printf("请输入两个数:");
    scanf("%d %d", &a, &b);
    printf("最大公约数为:%d\n", gcd(a, b));
    printf("最小公倍数为:%d\n", lcm(a, b));
    return 0;
}

求整数平方根

对于一个非负整数n,求它的整数平方根是经常出现的问题。可以通过二分查找等算法来进行求解。以下是求整数平方根的程序示例:

#include <stdio.h>

int sqrt(int n) {
    int left = 0, right = n, mid, ans;
    while (left <= right) {
        mid = (left + right) / 2;
        if (mid * mid <= n) {
            ans = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return ans;
}

int main() {
    int n;
    printf("请输入一个非负整数:");
    scanf("%d", &n);
    printf("整数平方根为:%d\n", sqrt(n));
    return 0;
}

判断一个数是否为质数

素数,也叫质数,是指除了1和本身以外,不存在其他正的约数的自然数。判断一个数是否为素数也是非常常见的问题。可以通过试除法等算法来进行判断。以下是判断一个数是否为素数的程序示例:

#include <stdio.h>
#include <stdbool.h>

bool is_prime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (is_prime(n)) {
        printf("是素数\n");
    } else {
        printf("不是素数\n");
    }
    return 0;
}

求某个数的阶乘

阶乘是指将一个数的所有正整数因子相乘所得到的结果。求一个数的阶乘也是非常常见的问题。以下是求某个数的阶乘的程序示例:

#include <stdio.h>

int fact(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * fact(n - 1);
    }
}

int main() {
    int n;
    printf("请输入一个非负整数:");
    scanf("%d", &n);
    printf("%d的阶乘为:%d\n", n, fact(n));
    return 0;
}

求组合数和排列数

组合数和排列数也是常见的数学问题。其中组合数是指从n个不同的元素中任取m个元素(不考虑顺序),一共有多少种取法;而排列数是指从n个不同的元素中任取m个元素(考虑顺序),一共有多少种取法。以下是求组合数和排列数的程序示例:

#include <stdio.h>

int fact(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * fact(n - 1);
    }
}

int C(int n, int m) {
    return fact(n) / fact(m) / fact(n - m);
}

int A(int n, int m) {
    return fact(n) / fact(n - m);
}

int main() {
    int n, m;
    printf("请输入n和m:");
    scanf("%d %d", &n, &m);
    printf("C(%d,%d)=%d\n", n, m, C(n, m));
    printf("A(%d,%d)=%d\n", n, m, A(n, m));
    return 0;
}

简单DP01背包问题

DP背包问题也是非常常见的问题之一,其中01背包问题是最基本的背包问题。以下是01背包问题的由来:

有N件物品和一个容量为V的背包。第i件物品的费用是Ci,价值是Wi。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

以下是01背包问题的动态规划思路和程序示例:

动态转移方程:

$$dp[i][j]=\max{dp[i-1][j],dp[i-1][j-C_i]+W_i}$$

程序示例:

#include <stdio.h>
#include <string.h>

int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int N, V;
    scanf("%d %d", &N, &V);
    int C[N+1], W[N+1];
    for (int i = 1; i <= N; ++i) {
        scanf("%d %d", &C[i], &W[i]);
    }
    int dp[N+1][V+1];
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= N; ++i) {
        for (int j = 0; j <= V; ++j) {
            if (j >= C[i]) {
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-C[i]]+W[i]);
            } else {
                dp[i][j] = dp[i-1][j];
            }
        }
    }
    printf("%d\n", dp[N][V]);
    return 0;
}

示例说明

示例一

假设我们需要求解如下的数学问题:

"输入两个数,求它们的最大公约数和最小公倍数"

我们可以使用上述程序示例中的代码进行求解,并进行以下的操作:

输入:

24 36

输出:

最大公约数为:12
最小公倍数为:72

示例二

假设我们需要求解如下的DP01背包问题:

"给定一个背包容量为10,N个物品,第i个物品的费用是Ci,价值是Wi,求这个背包能装下的最大价值是多少?"

我们可以使用上述程序示例中的代码进行求解,并进行以下的操作:

输入:

5 10
2 6
2 3
6 5
5 4
4 6

输出:

15

以上就是C语言数学问题与简单DP01背包问题的详解,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数学问题与简单DP01背包问题详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringBoot底层注解详解

    首先,我们需要了解SpringBoot的底层注解。SpringBoot是基于Spring框架的,都是使用注解来进行配置的。下面详细介绍几个重要的底层注解: @SpringBootApplication 这个注解是SpringBoot的核心注解,它的作用是将三个注解组合在一起,这三个注解分别是:@Configuration,@EnableAutoConfigu…

    Java 2023年5月19日
    00
  • 亲手教你SpringBoot中的多数据源集成问题

    多数据源集成是很多Spring Boot应用程序中经常遇到的问题。下面,我将详细讲解如何在Spring Boot中实现多数据源集成。 一、添加多个数据源的依赖项 首先,我们需要在项目中添加多个数据源的依赖项。可以使用Spring Boot提供的spring-boot-starter-jdbc依赖项,或者添加具体的数据库驱动依赖项(如:mysql-connec…

    Java 2023年5月20日
    00
  • Java中JDBC的使用教程详解

    Java中JDBC的使用教程详解 JDBC(Java Database Connectivity)是Java语言操作数据库的标准规范。本文将详细讲解Java中JDBC的使用教程,包括开发环境搭建、JDBC连接MySQL数据库、CRUD操作、事务管理等内容。 开发环境搭建 在使用JDBC之前,需要安装Java开发环境和MySQL数据库,并将MySQL JDBC…

    Java 2023年5月19日
    00
  • spring boot之使用spring data jpa的自定义sql方式

    下面是关于“spring boot之使用spring data jpa的自定义sql方式”的完整攻略: 1. 什么是Spring Data JPA? Spring Data JPA是Spring提供的对JPA规范的实现,它简化了Java应用程序与JPA之间的集成,使得我们可以更加方便的使用JPA进行数据访问。Spring Data JPA提供了许多便利的AP…

    Java 2023年6月2日
    00
  • Spring Boot中使用Spring-data-jpa实现数据库增删查改

    下面是关于“Spring Boot中使用Spring-data-jpa实现数据库增删查改”的完整攻略,包括以下内容: 前置条件 引入依赖 创建实体类 创建Repository接口 使用Repository接口实现数据库的增删查改 示例1:新增数据 示例2:查询数据 1. 前置条件 在使用Spring-data-jpa实现数据库操作之前,需要保证本地环境已经安…

    Java 2023年5月20日
    00
  • jdk1.8 LocalTime、LocalDate、LocalDateTime 使用大全

    目录 LocalTime、LocalDate、LocalDateTime 区别 LocalTime、LocalDate、LocalDateTime 使用 now 获取当前 时刻、日期、时间 of 获取指定 时刻、日期、时间 plus || minus 增加或者减少 更改指定的 时间 isAfter || isBefore 比较大小 compareTo 时间比…

    Java 2023年4月22日
    00
  • 如何进行Java压力测试?

    作为网站的作者,您想进行Java应用程序的压力测试以确保应用程序的性能能够满足用户期望和要求。在这里,我们将提供一个完整的Java应用程序压力测试攻略,它将使您了解压力测试的概念,不同类型的测试以及如何开始执行压力测试。下面是一个详细的步骤: 1.准备测试环境和工具 要执行Java应用程序的压力测试,您需要准备一个测试环境。这意味着您需要一个测试计划,例如一…

    Java 2023年5月11日
    00
  • 一文带你你搞懂Java的3种IO模型

    一文带你搞懂Java的3种IO模型 在Java中,输入输出操作是很常见的。Java的IO模型可以分为三种:Blocking IO、Non-blocking IO和异步IO。它们的区别在于处理IO事件的方式不同。 Blocking IO 在Blocking IO模型中,当向Socket写入数据时,线程会阻塞,直到数据被真正写入。而当Socket读取数据时,线程…

    Java 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部