/*----------------------------------------------------------------------------
* Project: Algorithms.cpp
* Name: zwp
* Date: 2014.3
*-----------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
typedef int ElementType;
struct Point
{
ElementType x;
ElementType y;
};
typedef Point *POINT;
typedef int **Matrix;
ElementType Dist(struct Point* num1, struct Point* num2)
{
ElementType result = (num1->x - num2->x)*(num1->x - num2->x) + (num1->y - num2->y)*(num1->y - num2->y);
return sqrt((double)result);
}
/*
** 求最近点对
*/
POINT NearPoint(POINT *point, int N)
{
int i, j;
for(i = 0; i < N; ++ i)
for(j = i + 1; j < N; ++ j)
if(Dist(point[i], point[j]) < 10)
return (&point[i][j]);
}
/*
** 矩阵相乘
*/
void MatrixMultiply(Matrix A, Matrix B, Matrix C, int N)
{
int i, j, k;
/* Initialize Matrix */
for(i = 0; i < N; ++ i)
for(j = 0; j < N; ++ j)
C[i][j] = 0;
for(i = 0; i < N; ++ i)
for(j = 0; j < N; ++ j)
for(k = 0; k < N; ++ k)
C[i][j] += A[i][k] * B[k][j];
}
/*
** 计算斐波那契数,糟糕版
*/
ElementType Fib(int N)
{
if(N <= 1)
return 1;
else
return Fib(N-1) + Fib(N-2);
}
/*
** 计算斐波那契数,优化版
*/
ElementType Fibonacci(int N)
{
int i, Last, NextToLast, Answer;
if(N <= 1)
return 1;
Last = NextToLast = 1;
for(i = 2; i <= N; ++ i)
{
Answer = Last + NextToLast;
NextToLast = Last;
Last = Answer;
}
return Answer;
}
/*
** 计算公式
*/
double Eval(int N)
{
int i;
double Sum;
if(N == 0)
return 1.0;
else
{
Sum = 0.0;
for(i = 0; i < N; ++ i)
Sum += Eval(i);
return (2.0*Sum/N + N);
}
}
/*
** 计算公式,优化版
*/
double Evale(int N)
{
int i, j;
double Sum, Answer;
double *C;
C = (double*)malloc(sizeof(double) * (N+1));
if(C == NULL)
printf("Out of Space....\n");
C[0] = 1.0;
for(i = 1; i <= N; ++ i)
{
Sum = 0.0;
for(j = 0; j < i; ++ j)
Sum += C[j];
/* 利用数组记录结果 */
C[i] = 2.0 * Sum/i + i;
}
Answer = C[N];
free(C);
return Answer;
}
typedef ElementType** TwoDimArray;
/*
** 矩阵乘法优化版M
*/
void OptMatrix(const long C[], int N, TwoDimArray M, TwoDimArray LastChange)
{
int i, k, Left, Right;
long ThisM;
for(Left = 1; Left <= N; ++ Left)
M[Left][Left] = 0;
for(k = 1; k < N; ++ k)
for(Left = 1; Left <= N-k; Left ++)
{
/* for each position */
Right = Left + k;
M[Left][Right] = 0;
for(i = Left; i < Right; ++ i)
{
ThisM = M[Left][i] + M[i+1][Right] + C[Left-1]*C[i]*C[Right];
if(ThisM < M[Left][Right])
{
/* Update min */
M[Left][Right] = ThisM;
LastChange[Left][Right] = i;
}
}
}
}
/*
** 最短路径问题
*/
void AllPairs(TwoDimArray A, TwoDimArray D, TwoDimArray Path, int N)
{
int i, j, k;
/* Initialize D and Path */
for(i = 0; i < N; ++ i)
for(j = 0; j < N; ++ j)
{
D[i][j] = A[i][j];
Path[i][j] = 0; /* NotAVertx */
}
for(k = 0; k < N; ++ k)
for(i = 0; i < N; ++ i)
for(j = 0; j < N; ++ j)
{
/* Update shortest path */
D[i][j] = D[i][k] + D[k][j];
Path[i][k] = k;
}
}
/*
** Random numbers
*/
static unsigned long seed = 1;
#define A 48271L
#define M 2147483647L
#define QQ (M / A)
#define RR (M % A)
long Seed = 100;
double Random(void)
{
long TmpSeed;
TmpSeed = A * (Seed % QQ) - RR * (Seed / QQ);
if(TmpSeed >= 0)
Seed = TmpSeed;
else
Seed = TmpSeed + M;
return (double) (Seed/M);
}
void Initialize(unsigned long InitVal)
{
Seed = InitVal;
}
/*
** 判断是否是素数
*/
ElementType Wintness(ElementType H, ElementType i, ElementType N)
{
ElementType X, Y;
if( i == 0)
return 1;
X = Wintness(H, i / 2, N);
if(X == 0)
return 0;
Y = (X * X) % N;
if(Y == 1 && X != 1 && X != N - 1)
return 0;
if(i % 2 != 0)
Y = (H * Y) % N;
return Y;
}
ElementType IsPrimer(ElementType N)
{
srand(time(0));
return (Wintness(rand(), N-1, N) == 1) ? TRUE : FALSE;
}
int main(int argc, char* argv[])
{
printf("%d \n", Evale(20));
int i = 0;
for(i = 10; i < 100; ++ i)
{
if(IsPrimer(i) == TRUE)
printf("%lf\n", i);
}
system("pause");
return 0;
}
不要让你的程序设计水平停留在“HelloWorld”级,同样不要让你的嵌入式水平停留在“流水灯”。
记得有本微软的书《C 编程精髓》不错推荐给阁下: