今天来讲讲尼科彻斯定理,简单介绍一下。
尼科彻斯定理即:任何一个整数 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。
这就是尼科彻斯定理,有什么不懂的或者我哪里讲错的都欢迎提问,指出,感谢。