今天来讲讲尼科彻斯定理,简单介绍一下。


尼科彻斯定理即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例:


1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19


简单易懂,2的立方就有两个奇数相加,3就有三个,4就有四个。

题目:输入一个正整数 m ( m≤100 ) ,将 m 的立方写成 m 个连续奇数之和的形式输出。


示例:

输入: 6

输出: 31+33+35+37+39+41




看完之后题目,我们该如何用代码去实现呢。首先我们先观察一下这题难的地方在哪里,又或者说解题的关键步骤在哪里。

问题1:m 个连续奇数之和的形式输出

问题2:初始值的寻找

问题3:输出出来

问题1:

这题还是比较明显的,可以看到从第一个奇数开始,后面的奇数就只是简单的每次加个2而已。加几个2就是m的事了。可以说已经解决了一个问题。那么现在关键问题就是如何找到这个‘初始值’。

问题2:

有关这个初始值的寻找,其他博主也有很多办法。我也看过一些方法,其实大同小异,我尽量用比较好理解的方式去讲解。首先咱们可以观察到1到2之间的初始值是连续的奇数,2到3之间就隔了一个奇数,3到4之间就隔了两个奇数。可以知道这是一个递增的值,我们可以采用让每次的初始值加上n个奇数成为下一个数的初始值。

问题3:

这个就很简单了,换个思路,除开初始值,其他每个数字是不是都是+%d,用个循环就ok了。

int main()
{
	int  m, n, start;
	start = 1;//初始值
	while (scanf("%d", &m) == 1)//多组输出
	{
		if (1 == m)
		{
			printf("%d", start);
			break;
		}
		for (n = 0; n <= m - 2; n++)//观察发现加几个奇数,可以用m-2来表达
		{
			start = (n + 1) * 2 + start;
		}
		printf("%d", start);
		for (int i = 1; i <= m - 1; i++)//输出的循环
		{
			printf("+%d", start + i * 2);
		}
		printf("\n");
		start = 1;
	}
	return 0;
}

最关键的是start = (n + 1) * 2 + start;这一步就是我说的“我们可以采用让每次的初始值加上n个奇数成为下一个数的初始值。”这里我把1的单独列出来,会省事一点,直接把初始值设为1,当我输入2的时候进入第一个for循环,m=2减去2之后为0,符合条件进入循环,(0 + 1)*2 + 1,这里1就是第一次的初始值,加上1个奇数,3就是把2的过程先重复一遍,初始值为3,在加上

(1 + 1)*2 + 3,4也一样。最后记得把start重新初始化为1。

输出简单,单独把初始值打印出来,再循环打印+%d,让初始值+i*2。

这就是尼科彻斯定理,有什么不懂的或者我哪里讲错的都欢迎提问,指出,感谢。