题目:A - Calculate S(n)
Calculate S(n).
S(n)=1 3+2 3 +3 3 +......+n 3 .
Input
Each line will contain one integer N(1 < n < 1000000000). Process to end of file.
Output
For each case, output the last four dights of S(N) in one line.
Sample Input
1
2
Sample Output
0001
0009
思路:首先看到10000000000000这个非常大的数的时候,则就不能单纯考虑用普通的循环与取余了,因为这么大的数不仅数会超,而且还会超时;所以这里因为只是后四位进行的操作,所以提前把10000以内的都取出来然后利用每次乘积都取10000余,然后再相乘的操作,算出立方和,最后的和也要进行取余操作,为了避免数值溢出。最后再输入的时候也在进行取余操作,然后利用下标直接输出对应数组中的值;
新技巧:这里的数组存的技巧已经会了,重要的时立方和每次乘积取余这个操作,对于有关取余的题目,在相乘或一些相加的时候随时进行取余,从而避免数据溢出(毕竟需要的只是后面的那几个数的结果而已)。然后提前存多少的问题,这里因为四位,所以提前存10000以内的即可,这样因为不能保证其10000以上的,但因为只需要算后四位的乘积,所以在输入的时候也进行取余,这样只是算后四位的乘积,所以就相当于只需要存1到10000以内的立方和的后四位。(小窍门,如果出现多少位的时候,即限制了位数的时候,一般计算或者存数的时候都只考虑这些就可以的,不过具体还要随机应变,但这个窍门可以让自己打开思路,加油);
代码:
#include<stdio.h>
int a[10000];
int main()
{
int N,i,j,t,sum;
a[0]=1;
for(i=1;i<=10000;i++)
a[i]=(a[i-1]+(((i+1)%10000*(i+1))%10000*(i+1))%10000)%10000;
while(scanf("%d",&N)!=EOF)
{
N=(N-1)%10000;
printf("%04d\n",a[N]);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。