从一道C语言练习题看思维误区:1平方+2平方+3平方+4平方+...+n平方

无意间看到一道C语言的练习题:求 1平方+2平方+3平方+4平方+…+n平方 ?

我略有所思,想到这不难解,定义两个函数,然后主函数main中调用下就完事了,思考过程如下:

1. 定义一个求平方的函数,接收一个参数,然后返回他的平方。
2. 定义一个求“1平方+2平方+3平方+4平方+...+n平方”的函数,接收一个参数,然后依次从1到n应用函数1求出平方,并相加。
3. main函数中,scanf接收用户输入的数n,然后调用函数2,printf输出结果。

代码如下:

 1 #include <stdio.h>
 2 
 3 int square(x){
 4     return x*x;
 5 }
 6 
 7 int accumulate(n){
 8     int i=1;
 9     int s=0;
10 
11     for(i=1;i<=n;i++){
12         s += square(i);
13     }
14 
15     return s;
16 }
17 
18 int main(void){
19     int n;
20     int s;
21 
22     printf("Please input one number: \n");
23     scanf("%d",&n);
24 
25     s = accumulate(n);
26     printf("%d\n",s);
27     return (0);
28 }

潇洒的写完代码后,跟答案一对发现不是这么回事,才猛然想到这应该有公式吧?高中时肯定学过这东西?于是我也想到了高斯求解1+2+3+…+n=n(n+1)/2的经典案例,然后我用这个来套一下,发现不行,得不到结果。于是,使大招google搜索下还真的有人和我遇到同样的问题,网友abada深度思考过这个问题,并且推导出来了s3=1^2+2^2+3^2+…+n^2=n(n+1)(2n+1)/6,参见http://blog.sina.com.cn/s/blog_3fd642cf0100beem.html

同时,我也找到了一个用微积分推导求解的过程,奈何我已经看不懂了,惭愧万分大学真的白上了。

公式都推导出来了,代码就很容易写了,不多说,改正后的代码如下:

 1 #include <stdio.h>
 2 
 3 // s = 1^2+2^2+3^2+...+n^2 = n*(n+1)*(2*n+1)/6
 4 
 5 int main(void){
 6     int n;
 7     int s;
 8 
 9     printf("Please input one number: \n");
10     scanf("%d",&n);
11 
12     s = n*(n+1)*(2*n+1)/6;
13     printf("%d\n",s);
14     return (0);
15 }

虽然使用第一种方式同样可以求出结果,但是显然第二种方式是最简单有效的,更符合出题者的心意的。面对一道中学的数学题,看了半天却解不出来,叹息良久,这么多年的学,难道真的是真的白上了吗?


自言自语:

如何去思考一件事情,然后做出正确的抉择,是我所向往的;而从本例中,可以看到,同一个问题,使用同样的工具(c语言),思考方式不同,做出的抉择也完全不同。我所期待的就是有一天,自己可以穿过迷雾,看到问题的本质,解决他或忽视他。