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

yizhihongxing

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日

相关文章

  • Java中的异常类有哪些?

    当Java程序运行中发生异常时,将会抛出一个异常类对象。Java中的异常类是通过Throwable类继承而来的,其中定义了两个重要的子类:Error和Exception。Error类表示由Java虚拟机生成的错误,例如系统崩溃或者虚拟机无法执行。而Exception类代表程序可以处理的异常,一般来说,程序中出现的异常都属于Exception类下的子类。下面将…

    Java 2023年4月27日
    00
  • Spring Security实现用户名密码登录详解

    Spring Security实现用户名密码登录详解 简介 Spring Security是Spring框架的一个模块,用于提供应用程序安全性。Spring Security基于servlet过滤器和Spring IoC,为web请求和方法注释提供安全性。 在本文中,我们将详细介绍Spring Security如何实现用户名密码登录功能,包括安全配置、用户信…

    Java 2023年6月3日
    00
  • SpringMVC请求数据详解讲解

    下面我将详细讲解“SpringMVC请求数据详解讲解”的完整攻略。 1. SpringMVC请求数据的概述 在Web开发中,一个请求的处理需要有数据的输入和输出。SpringMVC框架中,请求数据主要包含路由参数、请求参数和请求体三种形式。 路由参数为请求路径包含的参数,如对于路径 /user/{id},其中 {id} 就是路由参数。 请求参数为请求的Que…

    Java 2023年6月15日
    00
  • 五分钟解锁springboot admin监控新技巧

    五分钟解锁 Spring Boot Admin 监控新技巧 Spring Boot Admin 是一个用于监控和管理 Spring Boot 应用程序的开源项目。本文将介绍如何在 5 分钟内轻松启用和配置 Spring Boot Admin 监控。 步骤一:添加 Spring Boot Admin 依赖项 首先,需要添加以下 Spring Boot Admi…

    Java 2023年5月20日
    00
  • Java将对象保存到文件中/从文件中读取对象的方法

    Java将对象保存到文件中/从文件中读取对象的方法可以通过序列化(Serialization)实现。Serialization是将Java对象转换成字节序列以便将其存储在文件、传输或在网络上进行分享的过程。Java序列化机制可以确保序列化的对象的完整性。以下是保存/读取对象的方法。 将Java对象保存到文件中 首先,需要将Java对象序列化保存到文件中,该过…

    Java 2023年5月19日
    00
  • Java编程实现A*算法完整代码

    下面我将为您详细讲解如何实现A*算法的完整代码: A*算法简介 A算法,也称A星算法,是一种常用于寻路问题的启发式算法。它利用启发式的方式,在搜索时跳过无关的节点,从而提高了搜索效率。A算法基于广度优先搜索和最短路径算法,可以找到一条从起点到目标节点的最佳路径。 A*算法实现步骤 A*算法的实现步骤主要包含以下几个部分: 定义一个节点类(包含节点坐标、节点的…

    Java 2023年5月18日
    00
  • Spring Cloud zuul自定义统一异常处理实现方法

    来详细讲解一下“Spring Cloud zuul自定义统一异常处理实现方法”的完整攻略。 1. 背景介绍 Zuul 是 Netflix 出品的一个基于 JVM 用于构建可伸缩的微服务架构的 API 网关服务器。Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,它将请求路由到相应的服务。Zuul 还能够对请求进行过滤,其中最常用的是安全过滤器…

    Java 2023年5月27日
    00
  • Java实现普通类注入service对象

    使用Java实现普通类注入service对象的完整攻略如下: 步骤一:创建service类 首先,我们需要创建一个service类,它是一个标准的Java类,用于实现我们想要注入的业务逻辑。例如: package com.example.service; import org.springframework.stereotype.Service; @Serv…

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