蓝桥杯_PREV-1_核桃的数量 【GCD】

题目链接

问题描述

小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)

解题思路

求两遍最小公倍数即可。

代码部分

#include <iostream>
#include <stdio.h>
using namespace std;
int gcd(int a, int b)
{
    if(a == 0)
        return b;
    else
        return gcd(b % a, a);
}
int main()
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    int e = a * b;
    int f = e / gcd(a, b);
    e = f * c;
    f = e / gcd(f, c);
    printf("%d\n", f);
    return 0;
}
static U1 u1_s_DspMnscrlLnkUpdt(const U4 * u4p_indctdbit, U1 u1_numcntt, ST_DMNSCRL_STCTL * stp_stctl, const ST_DMNSCRL_STCFG * stp_stcfg, U1 u1_tabactv) { const ST_DMNINTRPT * stp_intrpt; U4 u4_jdgintrpt; U1 u1_scrlend; U1 u1_rsult; U1 u1_jdglinkupdt; U1 u1_updtmd; U1 u1_intrptcntt; U1 u1_prev; U1 u1_next; stp_intrpt = stp_stcfg->stp_intrpt; u1_rsult = (U1)TRUE; u1_scrlend = stp_stctl->u1_scrlend; u1_jdglinkupdt = (U1)DMNSCRL_INTBKCALL; u1_intrptcntt = stp_intrpt->u1_intrptcntt; while((u1_intrptcntt < u1_numcntt ) &&(u1_rsult == (U1)TRUE)){ if((stp_stctl->st_link[u1_intrptcntt].sts.u1_prev < u1_numcntt) && (stp_stctl->st_link[u1_intrptcntt].sts.u1_next < u1_numcntt)){ u1_jdglinkupdt |= (U1)DMNSCRL_INTLINKD; } else if(stp_stctl->st_link[u1_intrptcntt].u2_cnttlink == (U2)DMNSCRL_UNLINKD){ u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTLINKD; } else{ u1_rsult = (U1)FALSE; break; } if(u1_intrptcntt == stp_stctl->st_sts->sts.u1_dmncntt){ u1_jdglinkupdt |= (U1)DMNSCRL_INTCRRNT; } else{ u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTCRRNT; } u4_jdgintrpt = u4p_indctdbit[stp_intrpt->u1_rqarrypos] & stp_intrpt->u4_rqbit; if(u4_jdgintrpt != (U4)0){ u1_jdglinkupdt |= (U1)DMNSCRL_INTINDCTD; } else{ u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTINDCTD; } u1_jdglinkupdt &= (U1)DMNLNK_CNDMASK; u1_jdglinkupdt |= (U1)(stp_stcfg->stp_cnttinf[u1_intrptcntt].u1_attrbt << DMNLNK_CNDSHFT); u1_updtmd = u1_DMNSCRL_LNKUPDTMD[u1_jdglinkupdt]; switch(u1_updtmd){ case (U1)DMNLNK_NOP: break; case (U1)DMNLNK_RMV: u1_prev = stp_stctl->st_link[u1_intrptcntt].sts.u1_prev; u1_next = stp_stctl->st_link[u1_intrptcntt].sts.u1_next; stp_stctl->st_link[u1_prev].sts.u1_next = u1_next; stp_stctl->st_link[u1_next].sts.u1_prev = u1_prev; stp_stctl->st_link[u1_intrptcntt].u2_cnttlink = (U2)DMNSCRL_UNLINKD; break; case (U1)DMNLNK_RMVNXT: u1_prev = stp_stctl->st_link[u1_intrptcntt].sts.u1_prev; u1_next = stp_stctl->st_link[u1_intrptcntt].sts.u1_next; #if (__DMNSCRL_RMVNXTJMPFST_SUP__ == 1) stp_stctl->st_sts->sts.u1_dmncntt = stp_stctl->u1_scrlbegin; stp_stctl->st_sts->sts.u1_dmnopt = stp_stcfg->stp_cnttinf[stp_stctl->u1_scrlbegin].u1_defopt; #else stp_stctl->st_sts->sts.u1_dmncntt = u1_next; stp_stctl->st_sts->sts.u1_dmnopt = stp_stcfg->stp_cnttinf[u1_next].u1_defopt; #endif stp_stctl->st_link[u1_prev].sts.u1_next = u1_next; stp_stctl->st_link[u1_next].sts.u1_prev = u1_prev; stp_stctl->st_link[u1_intrptcntt].u2_cnttlink = (U2)DMNSCRL_UNLINKD; break; case (U1)DMNLNK_RMVNXT1ST: if(stp_stcfg->stp_cnttinf[stp_stctl->st_sts->sts.u1_dmncntt].fp_bkgnd != NULL){ stp_stctl->st_sts->u2_ctlsts = (stp_stcfg->stp_cnttinf[stp_stctl->st_sts->sts.u1_dmncntt].fp_bkgnd)(stp_stctl->st_sts->u2_ctlsts, (U1)DMNSCRL_BKGNDACT_INIT); } if(u1_tabactv == (U1)TRUE){ vd_DSPMNSCRL_LNKUPDTHOOK(); } u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTBKCALL; u1_prev = stp_stctl->st_link[u1_intrptcntt].sts.u1_prev; u1_next = stp_stctl->st_link[u1_intrptcntt].sts.u1_next; #if (__DMNSCRL_RMVNXTJMPFST_SUP__ == 1) stp_stctl->st_sts->sts.u1_dmncntt = stp_stctl->u1_scrlbegin; stp_stctl->st_sts->sts.u1_dmnopt = stp_stcfg->stp_cnttinf[stp_stctl->u1_scrlbegin].u1_defopt; #else stp_stctl->st_sts->sts.u1_dmncntt = u1_next; stp_stctl->st_sts->sts.u1_dmnopt = stp_stcfg->stp_cnttinf[u1_next].u1_defopt; #endif stp_stctl->st_link[u1_prev].sts.u1_next = u1_next; stp_stctl->st_link[u1_next].sts.u1_prev = u1_prev; stp_stctl->st_link[u1_intrptcntt].u2_cnttlink = (U2)DMNSCRL_UNLINKD; break; case (U1)DMNLNK_INSAREA: u1_next = stp_stctl->st_link[u1_scrlend].sts.u1_next; if(u1_next < u1_numcntt){ stp_stctl->st_link[u1_intrptcntt].sts.u1_prev = u1_scrlend; stp_stctl->st_link[u1_intrptcntt].sts.u1_next = u1_next; stp_stctl->st_link[u1_scrlend].sts.u1_next = u1_intrptcntt; stp_stctl->st_link[u1_next].sts.u1_prev = u1_intrptcntt; u1_scrlend = u1_intrptcntt; } else{ u1_rsult = (U1)FALSE; /* error */ } break; case (U1)DMNLNK_UPDTLNKPT: u1_scrlend = u1_intrptcntt; break; case (U1)DMNLNK_INSFLXBL: u1_next = stp_stctl->st_sts->sts.u1_dmncntt; u1_prev = stp_stctl->st_link[u1_next].sts.u1_prev; if((u1_next < u1_numcntt) &&(u1_prev < u1_numcntt)){ stp_stctl->st_link[u1_prev].sts.u1_next = u1_intrptcntt; stp_stctl->st_link[u1_next].sts.u1_prev = u1_intrptcntt; stp_stctl->st_link[u1_intrptcntt].sts.u1_prev = u1_prev; stp_stctl->st_link[u1_intrptcntt].sts.u1_next = u1_next; #if (__DMNSCRL_INSFLXBLJMPCRRNT_SUP__ == 1) stp_stctl->st_sts->sts.u1_dmncntt = u1_intrptcntt; stp_stctl->st_sts->sts.u1_dmnopt = stp_stcfg->stp_cnttinf[u1_intrptcntt].u1_defopt; #endif } else{ u1_rsult = (U1)FALSE; } break; case (U1)DMNLNK_INSFLXBL1ST: #if (__DMNSCRL_INSFLXBLJMPCRRNT_SUP__ == 1) if(stp_stcfg->stp_cnttinf[stp_stctl->st_sts->sts.u1_dmncntt].fp_bkgnd != NULL){ stp_stctl->st_sts->u2_ctlsts = (stp_stcfg->stp_cnttinf[stp_stctl->st_sts->sts.u1_dmncntt].fp_bkgnd)(stp_stctl->st_sts->u2_ctlsts, (U1)DMNSCRL_BKGNDACT_INIT); } if(u1_tabactv == (U1)TRUE){ vd_DSPMNSCRL_LNKUPDTHOOK(); } #endif u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTBKCALL; u1_next = stp_stctl->st_sts->sts.u1_dmncntt; u1_prev = stp_stctl->st_link[u1_next].sts.u1_prev; if((u1_next < u1_numcntt) &&(u1_prev < u1_numcntt)){ stp_stctl->st_link[u1_prev].sts.u1_next = u1_intrptcntt; stp_stctl->st_link[u1_next].sts.u1_prev = u1_intrptcntt; stp_stctl->st_link[u1_intrptcntt].sts.u1_prev = u1_prev; stp_stctl->st_link[u1_intrptcntt].sts.u1_next = u1_next; #if (__DMNSCRL_INSFLXBLJMPCRRNT_SUP__ == 1) stp_stctl->st_sts->sts.u1_dmncntt = u1_intrptcntt; stp_stctl->st_sts->sts.u1_dmnopt = stp_stcfg->stp_cnttinf[u1_intrptcntt].u1_defopt; #endif } else{ u1_rsult = (U1)FALSE; } break; default: u1_rsult = (U1)FALSE; /* error */ break; } stp_intrpt++; u1_intrptcntt = stp_intrpt->u1_intrptcntt; } return(u1_rsult); }结合刚才的u1_s_DspMnscrlDefLnkUpdt函数,逐行解释该代码,并给出该代码与u1_s_DspMnscrlDefLnkUpdt作用的区别
最新发布
08-13
<think>我们正在分析两个函数:u1_s_DspMnscrlDefLnkUpdt(之前已解释)和现在给出的u1_s_DspMnscrlLnkUpdt。 首先,我们逐行解释u1_s_DspMnscrlLnkUpdt函数,然后对比两个函数的区别。 函数:u1_s_DspMnscrlLnkUpdt 参数: const U4 * u4p_indctdbit: 指向指示位数组的指针(每个元素代表一组中断标志) U1 u1_numcntt: 内容项的总数 ST_DMNSCRL_STCTL * stp_stctl: 状态控制结构体指针 const ST_DMNSCRL_STCFG * stp_stcfg: 状态配置结构体指针(包含菜单配置信息) U1 u1_tabactv: 标签激活标志(TRUE/FALSE) 功能:根据中断标志更新菜单项的链接状态(动态更新) 逐行解释:</think>### 逐行代码解释(u1_s_DspMnscrlLnkUpdt函数) ```c static U1 u1_s_DspMnscrlLnkUpdt(const U4 * u4p_indctdbit, U1 u1_numcntt, ST_DMNSCRL_STCTL * stp_stctl, const ST_DMNSCRL_STCFG * stp_stcfg, U1 u1_tabactv) { // 变量声明 const ST_DMNINTRPT * stp_intrpt; // 中断配置结构指针 U4 u4_jdgintrpt; // 中断判断标志 U1 u1_scrlend; // 滚动结束位置(局部副本) U1 u1_rsult; // 操作结果标志 U1 u1_jdglinkupdt; // 链接更新判断标志 U1 u1_updtmd; // 更新模式 U1 u1_intrptcntt; // 中断内容索引 U1 u1_prev, u1_next; // 链表指针 // 初始化 stp_intrpt = stp_stcfg->stp_intrpt; // 获取中断配置数组 u1_rsult = (U1)TRUE; // 默认操作成功 u1_scrlend = stp_stctl->u1_scrlend; // 获取当前滚动结束位置 u1_jdglinkupdt = (U1)DMNSCRL_INTBKCALL; // 初始化更新标志 // 遍历中断配置数组 u1_intrptcntt = stp_intrpt->u1_intrptcntt; // 获取第一个中断索引 while((u1_intrptcntt < u1_numcntt) && (u1_rsult == (U1)TRUE)) { // 链接状态检查(与DefLnkUpdt相同) if((stp_stctl->st_link[u1_intrptcntt].sts.u1_prev < u1_numcntt) && (stp_stctl->st_link[u1_intrptcntt].sts.u1_next < u1_numcntt)) { u1_jdglinkupdt |= (U1)DMNSCRL_INTLINKD; } else if(stp_stctl->st_link[u1_intrptcntt].u2_cnttlink == (U2)DMNSCRL_UNLINKD) { u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTLINKD; } else { u1_rsult = (U1)FALSE; break; } // 当前项检查(与DefLnkUpdt相同) if(u1_intrptcntt == stp_stctl->st_sts->sts.u1_dmncntt) { u1_jdglinkupdt |= (U1)DMNSCRL_INTCRRNT; } else { u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTCRRNT; } // 中断标志检查(核心区别点) u4_jdgintrpt = u4p_indctdbit[stp_intrpt->u1_rqarrypos] & stp_intrpt->u4_rqbit; if(u4_jdgintrpt != (U4)0) { // 检测到有效中断 u1_jdglinkupdt |= (U1)DMNSCRL_INTINDCTD; } else { // 无中断 u1_jdglinkupdt &= (U1)U1_MAX ^ (U1)DMNSCRL_INTINDCTD; } // 确定更新模式(增加属性位移位) u1_jdglinkupdt &= (U1)DMNLNK_CNDMASK; u1_jdglinkupdt |= (U1)(stp_stcfg->stp_cnttinf[u1_intrptcntt].u1_attrbt << DMNLNK_CNDSHFT); u1_updtmd = u1_DMNSCRL_LNKUPDTMD[u1_jdglinkupdt]; // 查表获取模式 // 根据更新模式执行操作(相比DefLnkUpdt增加两种模式) switch(u1_updtmd) { case (U1)DMNLNK_NOP: // 无操作 break; case (U1)DMNLNK_RMV: // 移除链接(与DefLnkUpdt相同) // ... (更新链表指针) break; case (U1)DMNLNK_RMVNXT: // 移除并跳转(带条件编译) // ... (根据宏选择跳转目标) break; case (U1)DMNLNK_RMVNXT1ST: // 移除并跳转到首项(带后台调用) // ... (执行背景初始化和钩子函数) break; case (U1)DMNLNK_INSAREA: // 在区域插入 // ... (更新链表指针和滚动结束位置) break; case (U1)DMNLNK_UPDTLNKPT: // 更新链接点 u1_scrlend = u1_intrptcntt; // 仅更新局部变量 break; case (U1)DMNLNK_INSFLXBL: // 灵活插入(新增模式) u1_next = stp_stctl->st_sts->sts.u1_dmncntt; // 当前项 u1_prev = stp_stctl->st_link[u1_next].sts.u1_prev; // 前项 // 在prev和next之间插入新项 #if (__DMNSCRL_INSFLXBLJMPCRRNT_SUP__ == 1) // 条件跳转 stp_stctl->st_sts->sts.u1_dmncntt = u1_intrptcntt; // 更新当前项 #endif break; case (U1)DMNLNK_INSFLXBL1ST: // 灵活插入并跳转(新增模式) #if (__DMNSCRL_INSFLXBLJMPCRRNT_SUP__ == 1) // 执行背景初始化(与RMVNXT1ST类似) #endif // ... (插入操作与INSFLXBL相同) break; default: // 未知模式 u1_rsult = (U1)FALSE; break; } // 移动到下一个中断配置 stp_intrpt++; // 指针递增 u1_intrptcntt = stp_intrpt->u1_intrptcntt; // 获取下一个中断索引 } // 更新滚动结束位置(仅当UPDTLNKPT模式执行过) stp_stctl->u1_scrlend = u1_scrlend; return(u1_rsult); // 返回操作结果 } ``` ### 与u1_s_DspMnscrlDefLnkUpdt的核心区别 | 特性 | u1_s_DspMnscrlDefLnkUpdt | u1_s_DspMnscrlLnkUpdt | |---------------------|----------------------------------------|----------------------------------------| | **触发机制** | 基于内容支持位掩码(u4_cnttsup) | 基于外部中断位(u4p_indctdbit) | | **遍历方式** | 遍历所有滚动项(for循环) | 遍历中断配置数组(while循环) | | **更新模式** | 6种基本模式 | 8种模式(增加INSFLXBL/INSFLXBL1ST) | | **中断检测** | 内部支持位检查 | 外部中断标志检查 | | **属性处理** | 无特殊处理 | 包含内容属性移位(u1_attrbt << SHIFT) | | **滚动位置更新** | 直接修改结构体 | 通过局部变量u1_scrlend中转 | | **条件编译** | 较少(仅RMVNXT相关) | 较多(INSFLXBLJMPCRRNT_SUP等) | | **应用场景** | 菜单初始化/默认更新 | 动态响应外部事件(如按键/定时器中断) | ### 核心功能总结 1. **中断驱动更新**:通过`u4p_indctdbit`参数检测外部中断事件 2. **灵活插入模式**:新增`INSFLXBL`和`INSFLXBL1ST`实现动态菜单项插入 3. **属性感知**:利用`u1_attrbt`属性位影响更新模式选择 4. **局部状态管理**:通过`u1_scrlend`局部变量延迟更新滚动位置 5. **条件跳转支持**:通过`__DMNSCRL_INSFLXBLJMPCRRNT_SUP__`等宏控制跳转行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值