|
|
发表于 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;
}
|
|