快捷搜索: 王者荣耀 脱发

尼科彻斯定理(简单易懂)

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

尼科彻斯定理即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例: 尼科彻斯定理即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例:
1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19
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("
");
		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。

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

经验分享 程序员 微信小程序 职场和发展