(一)   此题为求表达式1+2+3^3+4+5+6^3+……的值,给定的n可能不是3的倍数。

(二)   此题若采用公式化简的方法:

n3的倍数:1+2+3^3+4+5+6^3+……+n^3

               =1+2+3+..+n-3+6+9+..+n+27*(1^3+2^3+3^3+..+[n/3]^3)

               =n*(n+1)/2-n*(n+3)/6+27*[n/3(n/3+1)/2]^2

若化简到最后为: n*n*(n^2+6*n+2) /12;

(三)   代码设计过程:

若采用直接利用最简公式n*n*(n^2+6*n+2) /12,是错误的。

很容易理解公式从左到右乘法得n的最高次方为4,而n最大为6位,乘起来必然超过了__int64d的表示范围。

比如n=90000时,得到结果-681050182461517205,说明有溢出。

#include<stdio.h>

 

int main()

{

  __int64 n,temp,sum;

  while(scanf("%I64d",&n)!=EOF)

  {

    if(n<0) break;

 

    temp=0;

    if(n%3==1) {temp=n;n--;}

    else if(n%3==2) {temp=2*n-1;n-=2;}

    //使n3的倍数

 

    sum=n*n*(n*n+6*n+13)/12;

 

    printf("%I64d\n",sum+temp);

 

  }

  return 1;

}

解决方法:采用倒数第二步公式n*(n+1)/2-n*(n+3)/6+27*[n/3(n/3+1)/2]^2,求sum

sum=n/3*(n/3+1)/2;

    sum*=sum;

    sum=sum*27+n*(n+1)/2-n*(n+3)/6;

这样就可以了!!

(四)另一种解法,最基本的递归。

此题目用递归反而比直接利用公式略少用时间,可能是公式中乘法的时间超过了递归的加法运行时间吧。

#include<stdio.h>
// if i can be divided exactly by 3 sum(i) = sum(i-1) + i*i*i;else sum(i) = sum(i-1) + i;
__int64 sum[100001];
int main()
{ __int64 i,n;
    sum[0]=0;
  for(i=1;i<=100000;i++) 
  {if(i%3==0) sum[i]=sum[i-1]+i*i*i;
   else sum[i]=sum[i-1]+i;
  }
  while(1)
  {scanf("%I64d",&n);
   if(n<0) break;
   printf("%I64d\n",sum[n]);
  }
    return 1;

}

(五)   总结:

当遇到求解公式,而公式中有n^4等等,n又比较大时,不要直接求,采用分布就可以了