求助,德国大学的算法作业!
这里是德国一大学本科计算机算法的一道上机题,要求使用循环密码加密文件,主要思路是:利用非线性公式:X(n+1)=a*X(n)-a*X(n)*X(n)对所读取的文件的每一个字符进行加密,其中,a是常数,X(0)的值给定。也就是说,对应的每个文件字符(二进制),通过计算X(n)的值,再与之相加,则得到相应被加密的字符,最后再输出到文件。
问题是:对于非线性公式,X(n+1)=a*X(n)-a*X(n)*X(n),当n很大的时候(n>10000)(n其实是文件的大小),计算量则会很大,现在要求优化算法以减少程序执行时间。
我写出了自己的求X(n)的函数,但不知道如何优化,请求各位高手帮助,代码如下:
#include <stdio.h>
#include <time.h>
#include <iostream.h>
#include <math.h>
#define origXn 0.1234
#define a 4
class cal
{
public:
double Xn(int n);
void MainCal(int n);
private:
int *inp;
int *shift;
int *out;
double *Xn_array;
};
double cal::Xn(int n)
{
int i;
Xn_array[0] = origXn;
for(i=1;i<=n;i++)
{
Xn_array[i] = a*Xn_array[i-1] - a*Xn_array[i-1]*Xn_array[i-1];
}
return Xn_array[n];
}
void cal::MainCal(int n)
{
int i;
inp = new int[n];
shift = new int[n];
out = new int[n];
Xn_array = new double[n];
for(i=0;i<n;i++)
{
shift[i] = (int)(Xn(i)*1000);
}
}
void main(void)
{
int num;
cal pro;
num = 40000; // this value is related with the length of file
clock_t startClock = clock();
cout<<"Please wait....."<<endl;
pro.MainCal(num);
cout<<"The program has run : "<<clock()-startClock<<" seconds"<<endl;
}