C语言大数据处理

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位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值