现代计算机蠕虫病毒传播途径多样化,除了利用移动介质如U盘等传播外,还可以 通过邮件、网页挂马、聊天工具、文件传输等多种方式传播,一些病毒甚至可以利用系统的某些漏洞自动进行传播。中毒的主机会自动搜索可以被感染的主机,并将 蠕虫病毒扩散开来。一台没有安装系统补丁、无安全防护软件的计算机连接到internet上,即使用户不做任何操作,只要网络是通的,在5分钟之内几乎必 定会感染上蠕虫病毒。下图是一个著名的病毒--红色代码在某天内传播感染计算机的情况。
红色代码病毒的传 播图
各种 各样的蠕虫病毒在Internet上进行传播,大量的主机被感染,新的病毒又在不断出现。这种现象与人类社会所面临的传染病流行的情形类似。它们都可以用 一个简单的数学模型来描述。
式中N 是表示所有的可能被感染的群体数量, 是已经被感染上病毒的个体所占的比 例,K 是一个常数,表示在一个时间段内某个病毒携带者(或感染病毒的计算机)能够传染其他的个体数 量。对于一个足够小的时间 ,新增加的被感染个体数 等于已经感染的数量 和可被感染的 的乘 积。这是一个微分公式。
我们往往关心的是被感染的主机比例 随着时间的增长变化的情况。对上面的 公式积分后得到如下的结果:
这个式子中的T 是一个积分常量,代表病毒的爆发期时刻。如下图的示例,传染能力(即在一段时 间内一台感染病毒的个体可以再感染的主机的多少)的度量值K=2.6。病毒的爆发期时间T=5.52。在5.52小时之前,病毒的传播速度还比较慢,接近 该时刻后,病毒感染了大量的主机,并且传播的速度也越来越快,最后几乎感染了所有的主机,再传播的速度也开始变慢了。前面红色代码病毒的传播图也表明了这 个特点。这个公式有一个著名的名称:罗杰斯特方程(logistic equation )。
logistic equation
参考文献:
一些病毒传播的动画:http://www.caida.org/publications/animations/#security
=====
本题的目的要求你实现logistic方程,对不同的输入参数,计算某些特定时刻的函数值。
输入:
参数K和T,以及用起始时刻ts ,终止时刻te 和 增量dt表示的一个时间区间[ts ,te )。包含ts ,但不含te 。
输出:
对应各个时刻点的感染个体的比例,用空格进行分隔,每10个数据后换行。最后一行如果不够 10个数据也要换行。(补充:可能出现(t e -t s )/dt不是整 数的情形,要注意是否应该取最后那个点 )
输出数据请采用格式化字符串" %4.3f",即每个数据之前放置一个空格,数据保留小数点后三位有效数字。
样例输入:
2.6□ 5.52↵
0□ 8□ 0.1↵
样例输出:
□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000↵
□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000↵
□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.000□ 0.001□ 0.001□ 0.001□ 0.001↵
□ 0.001□ 0.002□ 0.002□ 0.003□ 0.004□ 0.005□ 0.007□ 0.009□ 0.011□ 0.015↵
□ 0.019□ 0.024□ 0.031□ 0.040□ 0.052□ 0.066□ 0.084□ 0.106□ 0.133□ 0.166↵
□ 0.206□ 0.251□ 0.303□ 0.361□ 0.423□ 0.487□ 0.552□ 0.615□ 0.674□ 0.729↵
□ 0.777□ 0.819□ 0.854□ 0.884□ 0.908□ 0.927□ 0.943□ 0.956□ 0.965□ 0.973↵
□ 0.979□ 0.984□ 0.987□ 0.990□ 0.993□ 0.994□ 0.996□ 0.997□ 0.997□ 0.998↵
注意:(循环变量应使用整数类型)
import java.util.Scanner;
public class logistic {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double K = scanner.nextDouble();
double T = scanner.nextDouble();
int t1 = scanner.nextInt();
int t2 = scanner.nextInt();
double dt = scanner.nextDouble();
double a;
int len = 0;
for(int i=0;(t1+i*dt)