杭电OJ——1041 Computer Transformation
发布时间:2020-12-14 04:06:08 所属栏目:大数据 来源:网络整理
导读:Computer Transformation 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 eac
|
Computer Transformation
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
?
Sample Output
?
Source
Southeastern Europe 2005
?
Recommend
JGShining
?
1?题目意思很明确:step 0:1 step 1:01step 2:1001 step 3:0110 1001 step 4:1001 0110 0110 1001 step 5:0110 1001 1001 0110 1001 0110 0110 1001...通过自己推算,我们可以发现规律:从4开始,第n串中00的来源主要有两部分: 1. 第n-2串中00的数目 2. 第n-2串中1的数目而第n串中1的数目=2^(n-1) 因此,递推公式为: C(n)=C(n-2)+2^(n-3) 其中n>=4。 ?其中用到了大数的处理,整体来说不难!我们先打表,之后再输出即可!话说这杭电第一页上的题目怎么有那么多水题,受不了了,下一次做一点有技巧性的题目吧! 代码如下:
#include <iostream>
#include <string>
using namespace std;
const int SIZE = 1001;
const int BASE = 10;
string result[SIZE];
string two("2");
void initial()
{
int mcarry,temp,carry;
int k;
string tempResult;
result[1] = "0";
result[2] = "1";
result[3] = "1";
result[4] = "3";
for (int i = 5; i < SIZE; ++i)
{
mcarry = 0;
for (int j = 0; j < two.length(); ++j) /*先做乘法,求出2^(n-3)*/
{
temp = 2 * (two[j] - '0') + mcarry;
mcarry = temp / BASE; /*乘法进位*/
temp = temp % BASE;
tempResult += (temp + '0');
}
if (mcarry != 0) /*进位不为0*/
{
tempResult += (mcarry + '0');
}
two = tempResult; /*存储计算结果*/
tempResult.clear();
int minLength = two.length() > result[i - 2].length() ? result[i - 2].length() : two.length();
carry = 0;
for (k = 0; k < minLength; ++k) /*然后做加法f(n) = f(n -2) + 2^(n - 3)*/
{
temp = (two[k] - '0') + (result[i - 2][k] - '0') + carry;
carry = temp / BASE; /*加法进位*/
temp = temp % BASE;
result[i] += (temp + '0');
}
/*两个数可能长短不一,所以要比较再相加*/
if (minLength < two.length())
{
for(; k < two.length(); k++)
{
temp = (two[k] - '0') + carry;
carry = temp / BASE;
temp = temp % BASE;
result[i] += (temp + '0');
}
}
if(minLength < result[i - 2].length())
{
for(; k < result[i - 2].length(); ++k)
{
temp = (result[i - 2][k] - '0') + carry;
carry = temp / BASE;
temp = temp % BASE;
result[i] += (temp + '0');
}
}
if (carry != 0) /*进位不为0*/
{
result[i] += (carry + '0');
}
tempResult.clear();
}
}
int main()
{
int n;
initial(); /*先打表*/
while (scanf ("%d",&n) != EOF)
{
for(int i = result[n].length(); i > 0; --i)
cout << result[n][i - 1]; /*这一步很关键,由于数据是倒着存的,所以要反着输出*/
cout << endl;
}
system ("pause");
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
