目录
HDU1041——Computer Transformation
HDU1041——Computer Transformation
题目描述
题目翻译:
问题描述:最初,计算机中写入了一个由一位数字 1 组成的序列。在每个连续的时间步,计算机同时将每个数字 0 转换为序列 1 0,将每个数字 1 转换为序列 0 1。因此,在第一步之后,得到序列 0 1;在第二步之后,得到序列 1 0 0 1;在第三步之后,得到序列 0 1 1 0 1 0 0 1 等等。要找出经过 n 步后,序列中会出现多少对连续的 0 ?
输入:每一行输入包含一个自然数 n(0 < n ≤ 1000)。
输出:对于每个输入的 n,打印经过 n 步后序列中出现的连续 0 对的数量。
运行代码
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
// 这个函数实现的是两个字符串的加法操作。
string acm(string& co, string& gq) {
string str, strr;
int i, j;
int len_co = co.length();
int jin = 0, ji = 0, tmp, temp; // 进位标志,结果字符标志
// 字符串乘法实现,这里实际上是在进行二倍操作,即乘以2。
for (j = len_co - 1; j >= 0; j--) {
tmp = ((co[j] - '0') * 2 + jin) % 10;
jin = (co[j] - '0') * 2 / 10;
str = char(tmp + '0') + str;
}
if (jin) // 如果有进位,则添加到结果字符串最前面。
str = char(jin + '0') + str;
// 对齐两个字符串的长度,准备做加法。
int len_str = str.size();
int len_gq = gq.size();
int n = abs(len_str - len_gq);
if (len_str < len_gq)
for (i = 0; i < n; i++)
str = '0' + str;
else
for (i = 0; i < n; i++)
gq = '0' + gq;
// 字符串加法实现。
for (i = len_str - 1; i >= 0; i--) {
temp = str[i] - '0' + gq[i] - '0' + ji;
ji = temp / 10;
temp = temp % 10;
strr = char(temp + '0') + strr;
}
if (ji)
strr = char(ji + '0') + strr;
return strr;
}
// 主函数开始执行程序。
int main() {
int n;
string ls[1001]; // 存储每一步的结果序列。
// 初始化前两步的序列。
ls[1] = "0";
ls[2] = "1";
// 构建序列,这一步可以保留,但应该使用更有效的方法来计算连续0对。
for (int i = 3; i <= 1000; i++) {
ls[i] = acm(ls[i - 2], ls[i - 1]);
}
// 修改:读取用户输入并计算连续0对的数量。
while (cin >> n) {
const string& seq = ls[n];
int zeroPairs = 0; // 计算连续0对的数量。
// 遍历序列,计算连续0对的数量。
for (size_t i = 1; i < seq.size(); ++i) {
if (seq[i-1] == '0' && seq[i] == '0') {
zeroPairs++;
}
}
cout << zeroPairs << endl; // 输出连续0对的数量。
}
return 0;
}
<