【汇编语言实战】判断元素是否存在

该文章介绍了一个由整数构成的集合M的生成规则,通过C语言和汇编语言实现了一个函数来判断给定的数x是否能作为集合M的元素,通过递推操作2k+1和3k+1来确定。

有一个集合M是这样生成的:
(1) 已知 k 是集合 M 的元素;
(2) 如果 y 是 M 的元素,那么, 2y+1 和 3y+1 都是 M 的元素;
(3) 除了上述二种情况外,没有别的数能够成为 M 的一个元素。

任意给定 k 和 x,请判断 x 是否是 M 的元素。
如果是,则输出YES,否则,输出 NO

样例输入
0
22
样例输出
YES

思路:对k不断进行操作,即运算2k+1和3k+1,判断操作后得到的数是否等于x;
如果经过未知次的操作后,k=x,等于说明x可以放进集合;
如果x比k小,则不能放入集合,因为集合里放的是2k+1、3k+1之类的数;

C语言描述:

#include <stdio.h>
#include <stdbool.h>

// 判断 x 是否是集合 M 的元素
bool isElementOfM(int k, int x) {
    // 创建一个布尔型数组,用来记录集合 M 中的元素
    bool dp[x + 1];
    
    // 初始化数组,将所有元素标记为 false
    for (int i = 0; i <= x; i++) {
        dp[i] = false;
    }
    
    // 将 k 标记为集合 M 的元素
    dp[k] = true;
    
    // 从 k 开始递推生成集合 M 中的元素
    for (int i = k; i <= x; i++) {
        // 如果当前元素是集合 M 中的元素
        if (dp[i]) {
            // 根据规则 2,生成 2i+1 和 3i+1,并标记为集合 M 的元素
            if (2 * i + 1 <= x) {
                dp[2 * i + 1] = true;
            }
            if (3 * i + 1 <= x) {
                dp[3 * i + 1] = true;
            }
        }
    }
    
    // 返回 x 是否是集合 M 的元素
    return dp[x];
}

int main() {
    int k, x;
    
    // 输入 k 和 x
    printf("请输入 k 和 x:");
    scanf("%d %d", &k, &x);
    
    // 判断 x 是否是集合 M 的元素,并输出结果
    if (isElementOfM(k, x)) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
    
    return 0;
}

汇编语言:

include irvine32.inc

.data
x DWORD ?
k DWORD ?
yesMsg BYTE "YES", 0
noMsg BYTE "NO", 0

.code
dfs PROC
    mov eax, [esp+4]       ; 获取函数参数 k
    cmp eax, x             ; 比较 k 和 x
    jg L1                  ; 如果 k > x,返回 false
    je L2                  ; 如果 k == x,返回 true
    
    ; 递归调用
    mov eax, [esp+4]
    imul eax, 3
    inc eax
    push eax
    call dfs
    test al, al
    jnz L2

    mov eax, [esp+4]
    imul eax, 2
    inc eax
    push eax
    call dfs
    test al, al
    jnz L2

    jmp L1

L1:
    mov eax, 0              ; 返回 false
    ret

L2:
    mov eax, 1              ; 返回 true
    ret
dfs ENDP

main PROC
    mov edx, OFFSET k
    call ReadInt             ; 读取 k
    mov k, eax

    mov edx, OFFSET x
    call ReadInt             ; 读取 x
    mov x, eax

    push k
    call dfs                ; 调用 dfs 函数
    test al, al
    jnz L3

    mov edx, OFFSET noMsg
    call WriteString

    jmp L4

L3:
    mov edx, OFFSET yesMsg
    call WriteString

L4:
    call Crlf

    exit
main ENDP

END main

运行结果:

在这里插入图片描述

【多变量输入超前多步预测】基于CNN-BiLSTM的光伏功率预测研究(Matlab代码实现)内容概要:本文介绍了基于CNN-BiLSTM模型的多变量输入超前多步光伏功率预测方法,并提供了Matlab代码实现。该研究结合卷积神经网络(CNN)强大的特征提取能力与双向长短期记忆网络(BiLSTM)对时间序列前后依赖关系的捕捉能力,构建了一个高效的深度学习预测模型。模型输入包含多个影响光伏发电的气象与环境变量,能够实现对未来多个时间步长的光伏功率进行精确预测,适用于复杂多变的实际应用场景。文中详细阐述了数据预处理、模型结构设计、训练流程及实验验证过程,展示了该方法相较于传统模型在预测精度和稳定性方面的优势。; 适合人群:具备一定机器学习和深度学习基础,熟悉Matlab编程,从事新能源预测、电力系统分析或相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于光伏电站功率预测系统,提升电网调度的准确性与稳定性;②为可再生能源并网管理、能量存储规划及电力市场交易提供可靠的数据支持;③作为深度学习在时间序列多步预测中的典型案例,用于科研复现与教学参考。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注数据归一化、CNN特征提取层设计、BiLSTM时序建模及多步预测策略的实现细节,同时可尝试引入更多外部变量或优化网络结构以进一步提升预测性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秋说

感谢打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值