含k个3的数(信息学奥赛一本通-T1090)

本文介绍了一个简单的C++程序,用于判断一个输入的整数是否能被19整除,并且包含特定数量的数字3。通过对输入数字的每一位进行分析,程序能够准确地统计数字3出现的次数。

【题目描述】

输入两个正整数m和k,其中1<m<100000,1<k<5 ,判断m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 例如,输入:43833 3,满足条件,输出YES。如果输入:39331 3,尽管有3个3,但不能被19整除,也不满足条件,应输出NO。

【输入】

m 和 k 的值,中间用单个空格间隔。

【输出】

满足条件时输出 YES,不满足时输出 NO。

【输入样例】

43833 3

【输出样例】

YES

【源程序】

#include<iostream>
using namespace std;
int main()
{
    int m,k,a[5],i,num=0;

    cin>>m>>k;
    /*依次读取各位数字*/
    a[0]=m/10000;
    a[1]=m%10000/1000;
    a[2]=m%1000/100;
    a[3]=m%100/10;
    a[4]=m%10;

    for(i=0; i<=4; i++) //统计3的个数
        if(a[i]==3)
            num++;

    if((num==k)&&(m%19==0))//依照题意判断
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;

    return 0;
}

 

### 关于信息学奥赛一本 2070 的解析 目前未找到具体关于 **信息学奥赛一本 2070** 的官方解析或相关内容。然而,基于常见的信息学竞赛题目类型以及已知的信息学奥赛一本系列中的其他题目特点[^1],可以推测该题可能涉及经典的算法设计问题,例如动态规划、贪心算法、回溯法或其他基础据结构的应用。 如果假设此题属于常见类型的编程问题,则可以从以下几个方面入手分析: #### 可能的解题方向 1. **经典递归与分治策略** 如果题目类似于汉诺塔问题(如引用[1]所描述),则可以过递归来实现解决方案。对于较大的输入规模 \( N \),需注意时间复杂度优化,避免指级增长带来的性能瓶颈。 2. **位运算技巧** 若题目涉及到二进制表示或者特定条件下的值变换(如引用[2]所示的例子),可尝试利用位操作来简化逻辑判断和提高效率。例如: ```cpp int countBits(int n) { int cnt = 0; while (n) { cnt += n & 1; // 判断最低位是否为1 n >>= 1; // 右移一位 } return cnt; } ``` 3. **枚举与剪枝技术** 对于组合类问题(比如百钱买百鸡问题提到的穷举方法[^3]),合理设置循环边界并加入提前退出机制能够显著减少不必要的计算量。以下是类似的伪代码框架: ```cpp for (int rooster = 0; rooster <= totalMoney / costRooster; ++rooster) { for (int hen = 0; hen <= (totalMoney - rooster * costRooster) / costHen; ++hen) { int chicks = totalCount - rooster - hen; if (chicks >= 0 && chicks % chickGroupSize == 0 && rooster * costRooster + hen * costHen + chicks / chickGroupSize * costChick == totalMoney) { cout << "Solution found!" << endl; } } } ``` 4. **最长子序列变种** 假设目标是最长满足某种约束条件的子串/组片段(类似引用[4]讨论的内容),采用动态转移方程构建状态表是一种有效手段。下面展示了一个简单的 LIS 实现方式供参考: ```cpp vector<int> lis(const vector<int>& nums) { if (nums.empty()) return {}; vector<int> dp(nums.size(), 1), prevIndex(nums.size(), -1); int maxLength = 1, bestEnd = 0; for (size_t i = 1; i < nums.size(); ++i) { for (size_t j = 0; j < i; ++j) { if (nums[j] <= nums[i] && dp[j] + 1 > dp[i]) { dp[i] = dp[j] + 1; prevIndex[i] = j; if (dp[i] > maxLength) { maxLength = dp[i]; bestEnd = i; } } } } // Backtrack to construct the sequence vector<int> result; for (int k = bestEnd; k != -1; k = prevIndex[k]) { result.push_back(nums[k]); } reverse(result.begin(), result.end()); return result; } ``` 由于缺乏具体的题目陈述,上述仅为用思路总结,并不一定完全适用于实际场景。建议查阅对应章节原文获取更精准指导材料。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值