博客
关于我
7-14 整数分解为若干项之和 (15分)(附详细讲解(不用递归的高效算法))
阅读量:804 次
发布时间:2019-03-25

本文共 2058 字,大约阅读时间需要 6 分钟。

针对正整数N分解为多个正整数之和的问题,我们需要列举所有可能的分解方法,并按照递增顺序输出。这种分解方法可以采用递归的策略,每次从分解结果中找到一个可以合并的最右边部分,从而逐步简化问题。

针对输入的N=7,分解的思路是:

  • 首先生成一个全由1组成的数组,长度等于N本身;
  • 然后通过不断地合并相邻的部分,直到数组长度再减少为止;
  • 每次合并可以有两种选择:靠近右边的数字是否可以合并,或者需要进行递归调整以保持递增顺序。
  • 通过这种方式,我们可以得到所有可能的分解式子。

    改进后的算法直接在代码中处理分解过程,而不是通过递归调用,从而提高运行效率。这种方法尤其适用于较大的N值(如60及以上),性能提升显著。

    改进后的代码如下:

    #include 
    int main(void) { int n, i, len, origin, count, temp; int leap = 1; int a[30] = {0}; scanf("%d", &n); len = n; origin = len; for (i = 0; i < len; ++i) a[i] = 1; for(;;) { up: if (leap != 1) { printf("; "); printf("%d = ", n); for (i = 0; i < len; ++i) if(i == 0) printf("%d", a[i]); else printf("+%d", a[i]); ++count; if (count == 4) { printf("\n"); count = 0; } } if (a[0] == n) break; if (a[len-1] - a[len-2] <= 4) { ++a[len-2]; if (a[0] == n) goto up; --a[len-1]; temp = a[len-1]; for (i = len-1; i < origin; ++i) { if ((temp - a[len-2]) < a[len-2] && (temp - a[len-2]) != 0) { a[i] = a[len-2]; len = i + 1; temp -= a[len-2]; goto up; } } if (temp == 0) { if (a[len-1] == a[len-2] || (a[len-1] - a[len-2] == 1)) { a[len-2] += a[len-1]; --len; goto up; } if (a[0] > n) goto end; } else { a[len-1] -= 1; a[len-2] += 1; if (a[0] > n) goto end; } } else { a[len-1] -= 1; a[len-2] += 1; if (a[0] > n) goto end; } } end: return 0;}

    这种改进的算法直接在循环体内处理分解过程,减少了函数调用开销,显著提升了性能,特别是对于较大的N(如60及以上),效率提升明显。

    转载地址:http://rtnyk.baihongyu.com/

    你可能感兴趣的文章
    mysql 数据库备份及ibdata1的瘦身
    查看>>
    MySQL 数据库备份种类以及常用备份工具汇总
    查看>>
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    查看>>
    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
    查看>>
    MySQL 数据库的高可用性分析
    查看>>
    MySQL 数据库设计总结
    查看>>
    Mysql 数据库重置ID排序
    查看>>
    Mysql 数据类型一日期
    查看>>
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>
    Mysql 整形列的字节与存储范围
    查看>>
    mysql 断电数据损坏,无法启动
    查看>>
    MySQL 日期时间类型的选择
    查看>>
    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
    查看>>
    MySQL 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>