【c语言】整数拆分

将一个正整数n拆分成若干个正整数的和(至少两个数,n<=100)。

输入格式:

一个正整数n

输出格式:

若干行,每行一个等式(数与数之间要求非降序排列)。最后一行给出解的总个数

输入样例:

在这里给出一组输入。例如:

4
 

输出样例:

4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
4
 

最后一行的4表示总共有4个解。

 

主要思路: 使用深度优先搜索算法。从n开始,每次枚举所有可能的加数,如果加数满足要求,则将其加入到组成部分中,继续递归处理剩余部分,直到剩余部分被成功分解或者不满足要求,然后回溯,撤销当前加数的选择,尝试下一个加数。这样就能够穷举所有可能的分解方案。 使用递归函数dfs()实现深度优先搜索。dfs()函数有三个参数:cur表示当前需要分解的数,sum表示已经分解的数之和,last表示上一个加数。当cur为0且sum为n时,找到了一个分解方案,将其输出;否则,枚举所有可能的加数,并对剩余部分进行递归处理。 在dfs()函数中使用数组nums[]存储每个组成部分的数值,使用变量size记录当前组成部分的数量。在递归处理剩余部分时,需要将当前加数加入组成部分,并递归处理剩余部分,成功分解后回溯,撤销当前加数的选择。这里使用回溯法可以避免重复计算。

 

// 原作者箱庭,请勿转载

#include <stdio.h>

int n;          // 待分解的数
int nums[100];  // 存储每个组成部分的数值
int size;       // 当前组成部分的数量
int cnt;        // 分解方案的数量

// 深度优先搜索函数,cur为当前需要分解的数,sum为已分解的数之和,last为上一个加数
void dfs(int cur, int sum, int last) {
    // 如果已经成功分解出所有数且总和为n,则找到了一个分解方案
    if (cur == 0 && sum == n) {
        cnt++;  // 记录分解方案的数量
        // 输出分解方案
        printf("%d=%d", n, nums[0]);
        for (int i = 1; i < size; i++) {
            printf("+%d", nums[i]);
        }
        printf("\n");
    } else {
        // 枚举所有可能的加数
        for (int i = 1; i <= cur; i++) {
            // 确保加数不小于上一个加数,总和不超过n,并且不能仅剩一个数未加入
            if (i >= last && sum + i <= n && i<n ) {
                nums[size] = i;  // 将当前加数存入组成部分
                size++;          // 组成部分数量加1
                dfs(cur - i, sum + i, i);  // 继续分解剩余部分
                size--;          // 回溯,撤销当前加数的选择
            }
        }
    }
}
//原作者箱庭,请勿转载

int main() { scanf("%d", &n); // 输入待分解的数 nums[0] = 0; // 初始化组成部分,第一个数为0 size = 0; // 初始化组成部分数量 dfs(n , 0, 1); // 开始分解 printf("%d", cnt); // 输出分解方案数量 return 0; }

 

原文链接:https://www.cnblogs.com/xxoy/p/17201151.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【c语言】整数拆分 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 模拟实现strlen的三种方法

    一、strlen()的工作原理 二、模拟实现strlen的三种方法 计数器方法 指针-指针 递归的方法 三、库函数实现strlen的思路 四、库函数的strlen同上面模拟实现strlen的区别 一、strlen工作原理 strlen函数工作原理:是计算字符串str的长度,直到空字符串结束,但不包含空字符串。(即该长度算至/0结束,但不包含/0) 通过以下代…

    C语言 2023年4月18日
    00
  • lunc币怎么获得?lunc币怎么买?

    如果你想获得LUNC币,可以通过以下方式: 1. 购买LUNC币 你可以在以下交易平台上购买LUNC币: 火币网 币安 OKEx Gate.io 在购买LUNC币之前,你需要先注册并完成身份认证,这通常需要一些时间。一旦你完成了认证,你可以使用BTC、ETH、USDT等数字货币交换LUNC币。请注意检查交易所的手续费率、存款和提款条件。 例如,你可以使用10…

    C 2023年5月22日
    00
  • 优先队列(priority_queue)的C语言实现代码

    优先队列是一种特殊的队列,每个元素都有一个权值。优先队列不同于一般的队列,它不是先进先出,而是按照元素的权值排序,权值最高的元素最先出队列。 C语言中,我们可以使用结构体和数组来实现优先队列。以下是实现优先队列的C语言代码: #include <stdio.h> #include <stdlib.h> typedef struct p…

    C 2023年5月23日
    00
  • C++数字三角形问题与dp算法

    当我们需要寻找某一个问题的最优解时,动态规划(Dynamic Programming)算法可以是一个不错的选择。其中,C++数字三角形问题是一个典型的动态规划问题。本文将提供一个完整的攻略,以解决该问题。 问题描述 给定一个由整数组成的数字三角形,编写一个程序,寻找从自顶向下走的最优路径,使得路径上所经过的数字之和最大。每一步只能向下走到下一行中相邻的数字。…

    C 2023年5月22日
    00
  • c#实现几种数据库的大数据批量插入

    C#实现几种数据库的大数据批量插入攻略 在C#开发中,我们需要经常使用到数据库操作。如果遇到需要插入大数据量的情况,逐条插入会很慢,此时大数据批量插入就显得尤为重要。本文主要介绍如何使用C#实现MySQL和SqlServer两种数据库的大数据批量插入。 1. 大数据批量插入的原理 在进行大数据批量插入时, 我们不是直接将每条数据插入到数据库中,而是将多条数据…

    C 2023年5月22日
    00
  • Linux折腾记(八):使用GCC和GNU Binutils编写能在x86实模式运行的16位代码

    Linux折腾记(八)的主题是如何使用GCC和GNU Binutils编写能在x86实模式运行的16位代码。针对这个主题,我们可以分为以下几步。 步骤1:准备工作 在开始编写代码之前,我们需要安装在Ubuntu系统上安装GCC和GNU Binutils。可以使用以下命令进行安装: sudo apt-get update sudo apt-get instal…

    C 2023年5月23日
    00
  • Python 中的json常见用法实例详解

    Python 中的 JSON 常见用法实例详解 什么是 JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于 JavaScript 的语法规则,但具有更加简单易读的特点。JSON 格式的数据可以被快速解析和生成,是一种纯文本格式,可以通过网络进行通信,也可以存储在本地。因此它在 Web 应用中得到了…

    C 2023年5月23日
    00
  • js JSON.stringify()基础详解

    js JSON.stringify()基础详解 在JavaScript中,JSON.stringify()方法可以将JavaScript对象转换为JSON字符串。 方法语法 JSON.stringify(value[, replacer[, space]]) value: 要转换成 JSON 字符串的 JavaScript 对象或数组。 replacer(可…

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