以下是引用beyondyf在2011-6-26 22:11:55的发言:
有趣的题。第一题第二题很简单,下面给出算法。第三题大数的因式分解,我也没有很好的算法,和大家属于一个数量级。
正在看非诚勿扰,呵呵如果大家感兴趣,一会儿解释算法。
#include<stdio.h>
#include<math.h>
#define SQRT_5 2.2360679774997896964091736687313
#define A ((1 + SQRT_5) / 2)
#define B ((1 - SQRT_5) / 2)
int Test1(int n) //计算1-N以内(包括N)能被3和5整除的整数的和
{
int i, a3, a5, a15;
//n--;//如果不包括N请取消这行的注释
i = n / 3;
a3 = (3 * (i + 1) * i) >> 1;
i = n / 5;
a5 = (5 * (i + 1) * i) >> 1;
i = n / 15;
a15 = (15 * (i + 1) * i) >> 1;
return a3 + a5 - a15;
}
int Test2(int a) //计算小于等于a的fibonacci数列中的值为偶数的项的和
{
double x, y, sf;
int n, t;
x = log(SQRT_5 * a) / log(A);
x += 0.5;
n = (int)x;
y = (pow(A, n) - pow(B, n)) / SQRT_5;
y += 0.5;
t = (int)y;
if(t > a) n--;
sf = ((SQRT_5 + 1) / (SQRT_5 - 1) * (pow(A, n) - 1) - (1 - SQRT_5) / (1 + SQRT_5) * (1 - pow(B, n))) / SQRT_5;
sf += 0.5;
return ((int)sf) / 2;
}
int main()
{
printf("%d\n", Test1(1000));
printf("%d\n", Test2(4000000));
return 0;
}
有趣的题。第一题第二题很简单,下面给出算法。第三题大数的因式分解,我也没有很好的算法,和大家属于一个数量级。
正在看非诚勿扰,呵呵如果大家感兴趣,一会儿解释算法。
#include<stdio.h>
#include<math.h>
#define SQRT_5 2.2360679774997896964091736687313
#define A ((1 + SQRT_5) / 2)
#define B ((1 - SQRT_5) / 2)
int Test1(int n) //计算1-N以内(包括N)能被3和5整除的整数的和
{
int i, a3, a5, a15;
//n--;//如果不包括N请取消这行的注释
i = n / 3;
a3 = (3 * (i + 1) * i) >> 1;
i = n / 5;
a5 = (5 * (i + 1) * i) >> 1;
i = n / 15;
a15 = (15 * (i + 1) * i) >> 1;
return a3 + a5 - a15;
}
int Test2(int a) //计算小于等于a的fibonacci数列中的值为偶数的项的和
{
double x, y, sf;
int n, t;
x = log(SQRT_5 * a) / log(A);
x += 0.5;
n = (int)x;
y = (pow(A, n) - pow(B, n)) / SQRT_5;
y += 0.5;
t = (int)y;
if(t > a) n--;
sf = ((SQRT_5 + 1) / (SQRT_5 - 1) * (pow(A, n) - 1) - (1 - SQRT_5) / (1 + SQRT_5) * (1 - pow(B, n))) / SQRT_5;
sf += 0.5;
return ((int)sf) / 2;
}
int main()
{
printf("%d\n", Test1(1000));
printf("%d\n", Test2(4000000));
return 0;
}
能证明你的 performance 比我的好吗?