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

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

针对正整数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/

    你可能感兴趣的文章
    Objective-C实现linear congruential generator线性同余发生器算法(附完整源码)
    查看>>
    Objective-C实现linear discriminant analysis线性判别分析算法(附完整源码)
    查看>>
    Objective-C实现linear regression线性回归算法(附完整源码)
    查看>>
    Objective-C实现linear search线性搜索算法(附完整源码)
    查看>>
    Objective-C实现Linear search线性搜索算法(附完整源码)
    查看>>
    Objective-C实现LinearSieve线性素数筛选算法 (附完整源码)
    查看>>
    Objective-C实现LinkedListNode链表节点类算法(附完整源码)
    查看>>
    Objective-C实现LinkedList链表算法(附完整源码)
    查看>>
    Objective-C实现local weighted learning局部加权学习算法(附完整源码)
    查看>>
    Objective-C实现logistic regression逻辑回归算法(附完整源码)
    查看>>
    Objective-C实现logistic sigmoid函数(附完整源码)
    查看>>
    Objective-C实现longest Common Substring最长公共子串算法(附完整源码)
    查看>>
    Objective-C实现longest increasing subsequence最长递增子序列算法(附完整源码)
    查看>>
    Objective-C实现longestCommonSubsequence最长公共子序列算法(附完整源码)
    查看>>
    Objective-C实现LongestIncreasingSubsequence最长递增子序列算法(附完整源码)
    查看>>
    Objective-C实现lorenz transformation 洛伦兹变换算法(附完整源码)
    查看>>
    Objective-C实现Lower-Upper Decomposition上下分解算法(附完整源码)
    查看>>
    Objective-C实现LowerCaseConversion小写转换算法(附完整源码)
    查看>>
    Objective-C实现lowest common ancestor最低共同祖先算法(附完整源码)
    查看>>
    Objective-C实现LRU 缓存算法(附完整源码)
    查看>>