HDU 1041 Computer Transformation (简单大数)

Computer Transformation

http://acm.hdu.edu.cn/showproblem.php?pid=1041

Problem Description
A sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1. So, after the first time step, the sequence 0 1 is obtained; after the second, the sequence 1 0 0 1, after the third, the sequence 0 1 1 0 1 0 0 1 and so on. 

How many pairs of consequitive zeroes will appear in the sequence after n steps? 
 

 

Input
Every input line contains one natural number n (0 < n ≤1000).
 

 

Output
For each input n print the number of consecutive zeroes pairs that will appear in the sequence after n steps.
 

 

Sample Input
2
3
 

 

Sample Output
1
1
 
 解题思路:找出规律,F[n] = F[n-2] + 2n-3, 不过不能直接一起算,因为可能会超时;我们可以这样F[n] = F[n-2] + G[n-3]; (其中F[]代表多少对0,G[]代表有多少个1);
G[n] = G[n-1] + G[n-1];所以这里就只需要大数加法就够了!
 
解题代码:
 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <math.h>
 4 #include <string.h>
 5 #define CLE(name) memset(name, 0, sizeof (name))
 6 using namespace std;
 7 
 8 typedef __int64 LL;
 9 const int max_n = 1002;
10 
11 string F[2*max_n];
12 string P2[2*max_n];
13 int num1[max_n], num2[max_n];
14 
15 string add(string a, string b)
16 {
17     CLE(num1);
18     CLE(num2);
19     int len1 = a.length();
20     int len2 = b.length();
21     int k = 0;
22     for (int i = len1 - 1; i >= 0; i --)
23     {
24         num1[k++] = a[i] - '0'; 
25     }
26     k = 0;
27     for (int i = len2 - 1; i >= 0; i --)
28     {
29         num2[k++] = b[i] - '0'; 
30     }
31     int up = 0;
32     for (int i = 0; i < max_n/2; i ++)
33     {
34         num1[i] = num1[i] + num2[i] + up;
35         up = num1[i]/10;
36         num1[i] %= 10;
37     
38     }
39     for (k = max_n - 1; k >= 0; k --)
40     {
41         if (num1[k] != 0)
42             break;
43     }
44     a = "";
45     for (; k >= 0; k --)
46         a += num1[k] + '0';
47     return a;
48 }
49 
50 void pow2()
51 {
52     P2[0] = "1";
53     P2[1] = "2";
54     for (int i = 2; i <= 1000; i ++)
55     {
56         P2[i] = add(P2[i-1], P2[i-1]);
57     }
58 }
59 void deel()
60 {
61     F[0] = "0";
62     F[1] = "0";
63     F[2] = "1";
64     for (int i = 3; i <= max_n; i ++)
65     {
66         F[i] = add(F[i-2], P2[i-3]);
67     }
68     return;
69 }
70 
71 int main()
72 {
73     int n;
74     pow2();
75     deel();
76     while (~scanf ("%d", &n))
77     {
78         cout << F[n] << endl;
79     }
80     return 0;
81 }
View Code

 

 

posted on 2013-07-17 07:29  圣手摘星  阅读(250)  评论(0编辑  收藏  举报

导航