找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 422|回复: 7

传染病问题

[复制链接]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
发表于 2013-5-27 08:54:52 | 显示全部楼层 |阅读模式
[blockquote]
某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人,第6天开始发作,从发作到治 愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。[/blockquote][blockquote]
[/blockquote]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
 楼主| 发表于 2013-5-27 08:55:03 | 显示全部楼层
/**************************************************************
*     Copyright (C) 2006-2013 All rights reserved.
*       @Version: 1.0
*       @Created: 2013-05-06 23:00
*        @Author: chin - qin@126.com
*   @Description: 某种传染病第一天只有一个患者,前五天为潜伏期,
*                 不发作也不会传染人,第6天开始发作,从发作到治
*                 愈需要5天时间,期间每天传染3个人,求第N天共有
*                 多少患者。
*             @n: 输入第几天。
*
*          Return:返回第N天的患者数量
*
*       @History:
**************************************************************/
#include <stdio.h>
#include <stdlib.h>

int count = 1;
int main()
{
    int N = 0;
    printf("你想要计算第几天的感染人数:");
    scanf("%d",&N);
    infection(N);
    printf("第%d天共有%d个人被感染!\n",N,count);
    printf("************************************\n");

}
void infection(int N)
{
    int day =1;
    if(N <= 5){
        return;
    }
    else if(N>5&&N<10)
    {
        for(day = 6;day <= N;day++)
        {
            count = count + 3;
        }
    }
    else
    {
        for(day = 6;day <= 10;day++)
        {
            count = count + 3;
            infection(N-day+1);
            infection(N-day+1);
            infection(N-day+1);
        }
        count--;
    }
}

3

主题

4

回帖

0

积分

注册会员

积分
0
发表于 2013-5-27 13:01:58 | 显示全部楼层
:

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-5-27 22:14:18 | 显示全部楼层
[attachment=9]

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-5-27 22:15:09 | 显示全部楼层
#include <stdio.h>
#include <assert.h>

#ifdef _WIN32
typedef unsigned __int64 UINT64;
#else
typedef unsigned long long UINT64;
#endif

UINT64 infection(int day)
{
    int i = 0;
    UINT64 sum = 0;
    UINT64 temp = 0;
    UINT64 a[10] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    while (0 < --day)
    {
        temp = a[4] + a[5] + a[6] + a[7] + a[8];
        for (i = 9; i > 0; --i)
        {
            a = a[i - 1];
        }
        a[0] = temp * 3;
    }

    for (i = 0; i < 9; ++i)
    {
        sum += a;
    }

    return sum;
}

int main()
{
    int day = 0;

    // 测试用例
    assert(1 == infection(1));
    assert(1 == infection(2));
    assert(1 == infection(5));
    assert(4 == infection(6));
    assert(7 == infection(7));
    assert(10 == infection(8));
    assert(13 == infection(9));
    assert(15 == infection(10));
    assert(24 == infection(11));
    assert(42 == infection(12));
    assert(69 == infection(13));
    assert(105 == infection(14));
    assert(147 == infection(15));

    printf("输入第几天: ");
    scanf("%d", &day);

    // 100天以后感染人数已超出UINT64所能表示的范围
    if (100 < day)
    {
        printf("早世界末日了!\n");
        return 0;
    }

    printf("%I64u\n", infection(day));

    return 0;
}

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-5-27 22:16:05 | 显示全部楼层
貌似这个编辑框有bug,粘贴进去内容就变了。。。

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-6-1 13:39:52 | 显示全部楼层
解决了因数据过大,无法用内置数据类型表示的问题。

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
 楼主| 发表于 2013-6-18 09:19:58 | 显示全部楼层
思路独特
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 15:18 , Processed in 0.082787 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表