C语言大数据处理

来源:互联网 发布:161端口 编辑:程序博客网 时间:2024/05/19 13:26
Contents
  1. 1.Description
  2. 2.Input
  3. 3.Output
  4. 4.Sample Input
  5. 5.Sample Output
  6. 6.Source
  7. 7.Code
  8. 8.note
    1. 8.1.大数处理

Description

1
2
3
4
5
There are many students in PHT School.
One day, the headmaster whose name is PigHeader wanted all students stand in a line. He prescribed that girl can not be in single.
In other words, either no girl in the queue or more than one girl stands side by side. The case n=4 (n is the number of children) is like FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM。
Here F stands for a girl and M stands for a boy. The total number of queue satisfied the headmaster’s needs is 7.
Can you make a program to find the total number of queue with n children?

Input

There are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means the number of children (1<=n<=1000)

Output

For each test case, there is only one integer means the number of queue satisfied the headmaster’s needs.

Sample Input

1
2
3
1
2
3

Sample Output

1
2
3
1
2
4

Source

HDU1297

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//
// Created by Kevin on 2016/10/16.
//
#include<stdio.h>
int main() {
int n;
int f[1001][101] = {0};
f[0][1] = 1;
f[1][1] = 1;
f[2][1] = 2;
f[3][1] = 4;
for (int i = 4; i < 1001; ++i) {
for (int j = 1; j < 101; ++j) {
f[i][j] += f[i - 1][j] + f[i - 2][j] + f[i - 4][j]; //数组的每一位相加
f[i][j + 1] += f[i][j] / 10000; //超过4位的部分保存至数组下一位中
f[i][j] %= 10000; //每位数组只保存其中4位
}
}
while (scanf("%d", &n) != EOF) {
int k = 100;
while (!f[n][k--]); //排除前面为空的数组
printf("%d", f[n][k + 1]); //输出结果的前四位
for (; k > 0; --k) {
printf("%04d", f[n][k]); //输出其余的所有四位数字,若数字小于四位,则前面用0填充
}
printf("\n");
}
return 0;
}

note

a.男孩,任何n - 1的合法队列追加1个男孩必然是合法的,情况数为f[n - 1];

b.女孩,在前n - 1的以女孩为末尾的队列后追加1位女孩也是合法的,我们可以转化为n - 2的队列中追加2位女孩;

一种情况是在n - 2的合法队列中追加2位女孩,情况数为f[n - 2];

但注意到可能前n - 2位以女孩为末尾的不合法队列(即单纯以1位女孩结尾),也可以追加2位女孩成为合法队列,而这种n - 2不合法队列必然是由n - 4合法队列+1男孩+1女孩的结构,即情况数为f[n - 4]。

大数处理

本题数据量极大,无法用任何数据类型直接存储,于是采用二维数组模拟大数运算,每一位单独相加,每位数组只保存其中4位。

0 0
原创粉丝点击