求助,德国大学的算法作业!

bjtoto 2002-05-17 09:12:56
这里是德国一大学本科计算机算法的一道上机题,要求使用循环密码加密文件,主要思路是:利用非线性公式: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;

}
...全文
35 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
youwill 2002-05-17
  • 打赏
  • 举报
回复
普通叠代是没有理论上的优化办法的,只有根据具体的情况打破叠代才有可能。(这是在算法上讲)
在编程上讲,优化的方法也是有的,但你的程序简单,没有太多优化的余地。
bjtoto 2002-05-17
  • 打赏
  • 举报
回复
谢谢大家!
icetea121 2002-05-17
  • 打赏
  • 举报
回复
是啊,这就是一般的叠代法啊,基本上没有什么优化的意义啦,多留点时间做其他的题吧
xiongxiao 2002-05-17
  • 打赏
  • 举报
回复
将文件分成 固定长度 的段再加密,这样就不怕大N了。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧