我试了一下可能有下面的规律,不一定准确仅供参考 。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 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 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;以上算法我随手写,不足的地方你自己改进.题外话,
不知道是不是要参加大赛,如果是,你要多努力啊
.结果如下.
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;
}
}
} }
}
}
讨论:
首先确定 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也成立。这是这个问题的普遍解。因为“/”为整除,所以前后不要合并,如果用计算机解就没问题了。从这个公式可以推征第一种方法的原理。
f(n)=f(n-1)+(n-1)/2*2 {整除}
if (n==1) f(n)=1