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日

相关文章

  • 把textarea中字符串里含有的回车换行替换成<br>的javascript代码

    将textarea中字符串里含有的回车换行替换成<br>的javascript代码可以通过正则表达式以及字符串操作来实现,具体步骤如下: 第一步:获取textarea中的值 我们可以通过JavaScript来获取textarea中的值,代码示例如下: const textArea = document.querySelector(‘textare…

    Java 2023年6月15日
    00
  • Java Apache Commons报错“DataAccessException”的原因与解决方法

    当使用Java的Apache Commons类库时,可能会遇到“DataAccessException”错误。这个错误通常由以下原因之一起: 数据库连接错误:如果数据库连接错误,则可能会出现此错误。在这种情况下,需要检查数据库连接以解决此问题。 SQL语句错误:如果SQL语句错误,则可能会出现此错误。在这种情况下,需要检查SQL语句以解决此问题。 以下是两个…

    Java 2023年5月5日
    00
  • Tomcat服务器入门超详细教程

    Tomcat服务器入门超详细教程 Tomcat是一个基于Java的Web服务器,可以用来运行Java Web应用程序。它是开源软件,免费使用,易于安装和配置。本教程将介绍如何在计算机上安装Tomcat服务器,并在其上运行Java Web应用程序。以下是完整的攻略: 步骤1:下载和安装Java Development Kit(JDK) Tomcat服务器需要J…

    Java 2023年5月19日
    00
  • SpringCloud Gateway 路由配置定位原理分析

    Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关,它提供了一种简单而有效的方式来路由请求、过滤请求和转换请求。在本文中,我们将详细讲解Spring Cloud Gateway的路由配置定位原理分析。 路由配置 在Spring Cloud Gateway中,我们可以使用路由配置来定义请求的路由规则。路由配置由一个或多…

    Java 2023年5月18日
    00
  • Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan

    当我们需要在Java中复制(拷贝)数组时,有四种主要的方法可供选择: 使用arraycopy()方法 使用clone()方法 使用copyOf()方法 使用copyOfRange()方法 下面,我们将详细讲解这四种方法。 1. 使用arraycopy()方法 public static void arraycopy(Object src, int srcPo…

    Java 2023年5月26日
    00
  • boot-admin整合Quartz实现动态管理定时任务

    淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉、烤串、小饼和蘸料,音乐响起,啤酒倒满,烧烤灵魂的party即将开场的时候,你系统中的Scheduler(调试器),也自动根据设定的Trigger(触发器),从容优雅的启动了一系列的Job(后台定时任务)。工作一切早有安排,又何须费心劳神呢?因为boot-admin早已将Quartz这块肉串在了烤签上!项…

    Java 2023年4月27日
    00
  • java中ssj框架的项目搭建流程

    下面就是Java中SSJ框架项目搭建流程的完整攻略: 1. 准备工作 安装Java开发工具包(JDK) 安装集成开发环境(IDE)如IntelliJ IDEA或Eclipse 安装Maven构建工具 2. 新建Maven项目 使用IDE创建新的Maven项目,需要指定Maven坐标,其中包含了项目的各个基本属性,如groupId,artifactId,ver…

    Java 2023年5月20日
    00
  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    首先需要明确的是,BeanFactoryPostProcessor是在Spring容器实例化Bean之后,在Bean实例化之前处理BeanFactory中的BeanDefinition的接口。 一、BeanFactoryPostProcessor的使用场景 通常,在开发中,我们会利用BeanFactoryPostProcessor来修改或扩展BeanDefi…

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