我试了一下可能有下面的规律,不一定准确仅供参考 。1 2 3 4 5 6 71 3 4 3 2 1 1
1 3 3 2 1 1
1 2 2 1 1
1 2 1 1
1 1 1
1 1
1
最上一排为分成几部分相加,例如2+3就是分为2部分相加。
下面的数字是7--1 分别可以分的组数。
一个自然数N 则分为1分和N分 各有一个。
分为2分为 N\2 .
分为(N-1)分 有 (N-1)个1相加再加2 一个。
其余则 分为(N-x)项有 (n-1) 相对应项 多加一个。
比如 6分成3部分就是5分成2部分的数
奇数与偶数要分别对待。
可以用递归做做试。

解决方案 »

  1.   

    算法嘛,简单,首先分析任意一个自然数(自然数不包括0),加数及被加数必须要小于或他本身这里以5为例:最大加数为1的情况
    1 2 3 4 5
    1 1 1 1 无
    1 1 1
    1 1 1
    1 最大加数为2的情况
    1 2 3 4  5
    2 2 2 无 无
    2 1最大加数为3的情况1 2 3  4  5
    3 3 无 无 无
    1最大加数为4的情况1  2  3  4  5
    4  无 无 无 无那么作为一个为5的自然数,就包括以上4+3+2+1这样的方法(如果等于5也算那么就是4+3+2+1+1)那么由此可推任意自然数N=N-1+N-2......+1+1算法实现如下:int i=Console.Readline();
    int sum=0;
    for(i-=1;i==1;i--)
    sum+=i;return sum;以上算法我随手写,不足的地方你自己改进.题外话,
    不知道是不是要参加大赛,如果是,你要多努力啊
      

  2.   

    >>忘了注明2+3与3+2是一样的。那也简单,你可以看什么时候出现一样的情况很清楚嘛,加数和被加数颠倒的情况如果用排列组合问题,可以很麻烦,程序至少要在40行左右,你把上面的程序,sum-=N/2;这样就没问题了.
      

  3.   

    to:心情飘飘,你的算法还不行,有很多漏洞,你只处理了两个数相加的情况,如果是多个数相加的话,除2是不好用的,如果n个数相加,组合有很多种。
      

  4.   

    这是用递规逐层算出来的,程序代码如下,程序思路就这样,具体的边界你可能要自己改改.
    .结果如下.
    1 - 1
    前面都一样
    7 - 15
    8 - 21
    9 - 30
    10 - 42
    ...
    到100就很慢了.
    using System;namespace CSDN
    {
    public class MyNum
    {
    static int[] num = new int[255];
    static int total; public static void Main()
    {
    Console.Write("输入要分解的数字: ");
    int i = int.Parse(Console.ReadLine());
    Find(i,1);
    Console.WriteLine(total);
    Console.ReadLine();
    } private static void Find(int n, int deep) // n --要分解的数  deep --层数
    {
    int rest;
    for(int i = 1; i <= n; i++)
    {
    if (num[deep - 1] <= i) //为了避免重复
    {
    num[deep] = i;
    rest = n - i;
    if (rest > 0) //继续递规
    {
    Find(rest,deep + 1);
    }
    else 
    {
    total++;
    num[deep] = 0;
    }
    }
    } }

    }
    }
      

  5.   

    解决这个问题用如下公式:
    讨论:
        首先确定 1 是否存在算式。根据题意,1没有表达式。因此1 有0种表达是
    因此表达式个数如下:
     1:0
     2:1
     3:2
     4:4
     5:5
     6:7
     …………
     第一种方法:首先分析序列 m in (0、1、2、4、5、7……) 和序列f(m) in(1、2、3、4、5、6……)的关系
    begin
      如果 m%2=0(m为偶数)那么  f(m)=f(m-1)+2;
      如果 m%2=1(m为奇数)那么  f(m)=f(m-1)+1;
      f(2)=1;
    end
    将begin...end之间的部分递归就可以得到答案。  第二种方法:
      采用加1序列递推得出公式
      f(m)=(m-1)+(m-2)/2  {其中 m>0,并且“/”为整除}
      这个公式对于m=1也成立。这是这个问题的普遍解。因为“/”为整除,所以前后不要合并,如果用计算机解就没问题了。从这个公式可以推征第一种方法的原理。
      

  6.   

    公式
    f(n)=f(n-1)+(n-1)/2*2 {整除}
    if (n==1) f(n)=1