某种传染病第一天只有一个患者,前5天为潜伏期,不发作也不会传染人,第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。
详细数据分析如下表:(前20天状况)
④潜伏期人数=前一天潜伏期人数-潜伏期转发作期人数+当天新传染人数
①潜伏期转发作期人数=5天前新感染人数
②发作期人数=前一天发作期人数-当天康复人数+5天前新感染人数(或当天潜伏转发作期人数[5~10天计算时只能使用这个量])
③当天新感染人数=3*当天发作期人数
②当天康复人数=5天前潜伏期转发作期人数(或10天前新感染人数)
⑤患者=潜伏期人数+发作期人数
根据上面的关系式可以简单分析出来,如果要求未知的某天的信息,就必须知道前一天的信息和前五天的信息
假设输入11天,则需要知道第10天和第6天的相关内容;假设输入13天则需要第12天和第8天内容,而第12天又需要知道第11天和第7天的数据信息
所以因为需要知道的距离输入时间最远的时间是5天,而未经过计算已知数据的最晚天数是第10天,则第11天到第15天是个转换阶段
下面是算法核心函数:
AC1(int days)用来计算对应天数的所有数据
AC2(int days)AC2用来反复调用AC1来实现对输入第N天得前面所有天数的数据求值的方式来求得第N天数据
ACattack(int days)计算当天发作人数
ACperpatent(int days)计算当天潜伏期人数
ACrecovery(int days)计算康复人数
ACQZF(int days)计算潜伏期转发作期的人数
ACinfection(int days)计算当天感染的人数
下面是算法的Java代码实现:
package com.cn;
import java.util.Scanner;
public class Patient2 {
//下面数组用于寄存前99天的相关数据,[0]暂且不用,但是实际计算量太大这些天完全用不完就出现了溢出
static int[] perpatent=new int[100]; //潜伏期人数
static int[] QZF=new int[100]; //潜伏期转发作期人数
static int[] attack=new int[100]; //发作期人数