HDU1041——Computer Transformation,HDU1042——N!,HDU1043——Eight

目录

HDU1041——Computer Transformation

题目描述

运行代码

代码思路

HDU1042——N!

题目描述

运行代码

代码思路

HDU1043——Eight

题目描述

运行代码

代码思路

HDU1041——Computer Transformation

题目描述

Problem - 1041

题目翻译
问题描述:最初,计算机中写入了一个由一位数字 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;
}<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值