好数(蓝桥杯)

2024-04-15 06:04
文章标签 蓝桥 好数

本文主要是介绍好数(蓝桥杯),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 好数
    • 题目描述
    • 暴力方法一
    • 暴力方法二(超时)

好数

题目描述

【问题描述】
一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称之为“好数”。

给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
【输入格式】
一个整数 N。
【输出格式】
一个整数代表答案。
【样例输入 1】

24

【样例输出 1】

7

【样例输入 2】

2024

【样例输出 2】

150

【样例说明】
对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。

【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ N ≤ 100。
对于 100% 的评测用例,1 ≤ N ≤ 107

暴力方法一

从题目中可以得出结论:奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数

那么就可以定义一个k代表数字n的当前位数,从1开始计数,即个位是1,十位是2,百位是3……

然后就可以从个位开始取数,判断该数是否为好数,每取走一位,k加上1,进入下一位

// 包含C++程序中常用的库,是C++标准库的一个集合,包括了I/O、字符串和容器等
#include<bits/stdc++.h>
// 使用std命名空间中的名字,避免每次调用标准库中的东西都要加上std::前缀
using namespace std;// 定义一个函数check,用于检查某个整数n是否是“好数”
bool check(int n)
{int k=1; // 代表数字n的当前位数,从1开始计数,即个位是1,十位是2,百位是3,以此类推// 循环检查整数n的每一位while(n){int t=n%10; // t为n的当前最低位的数字,%运算符取余数// 检查当前位数k是否与对应的数字t符合好数的定义if(k%2==1 && t%2==0) // 如果位数k是奇数但数字t是偶数,则不满足好数的定义return false; // 返回false,表示n不是好数if(k%2==0 && t%2==1) // 如果位数k是偶数但数字t是奇数,则不满足好数的定义return false; // 返回false,表示n不是好数n /= 10; // n去掉最低位的数字,/=运算符用来对n除以10并将结果赋值给nk++; // 增加位数计数器,因为已经检查了一位}// 如果所有位的检查都通过,则n是好数return true; // 返回true,表示n是好数
}// 程序的主函数
int main()
{int n; // 定义一个整型变量n用来存放输入的数字cin >> n; // 从标准输入流中读取一个整数到变量nint ans = 0; // 初始化答案变量ans,用于计数有多少个好数// 循环,从1开始到n结束for(int i=1; i<=n; i++){// 调用check函数检查i是否是好数if(check(i))ans++; // 如果i是好数,就将答案变量加1}// 输出答案cout << ans;// 返回0,标识程序正常结束return 0;
}

暴力方法二(超时)

分情况讨论:

  • 当该数位数为奇数时,可以得到结论:偶数位上是奇数,奇数位上是偶数
  • 当该数位数为偶数时,可以得到结论:偶数位上是偶数,奇数位上是奇数

代码如下:

// 包含C++标准库的头文件,用于I/O操作和字符串处理
#include<bits/stdc++.h>
using namespace std;int main() {int n;            // 定义一个整数变量n用来存储输入的整数Ncin >> n;         // 从标准输入流中读取一个整数到n中int ans = 0;      // 定义并初始化计数器ans,用来记录总的好数的数量// 用一个for循环遍历从1到n的所有整数,检查每个数是否为好数for(int i = 1; i <= n; i++) {string s;        // 定义一个字符串s,用来存储当前数字的字符串表示s = to_string(i); // 把当前的整数i转化为字符串格式存储在s中int flag = 0;    // 定义一个标识变量flag,用来表示当前数是否为好数// 当数字的位数为奇数时,进行检查if(s.size() % 2 == 1) {// 遍历数字的每一位for(int j = 0; j < s.size(); j++) {// 如果位数是奇数位(从0开始计数),但数字是偶数,设置标志并跳出循环if(j % 2 == 0 && (s[j] - '0') % 2 == 0) {flag = 1;break;}// 如果位数是偶数位,但数字是奇数,设置标志并跳出循环if(j % 2 == 1 && (s[j] - '0') % 2 == 1) {flag = 1;break;}}}// 如果数字的位数为偶数,进行检查if(s.size() % 2 == 0) {// 同样地,遍历数字的每一位for(int j = 0; j < s.size(); j++) {// 如果位数是奇数位,但数字是偶数,设置标志并跳出循环if(j % 2 == 0 && (s[j] - '0') % 2 == 1) {flag = 1;break;}// 如果位数是偶数位,但数字是奇数,设置标志并跳出循环if(j % 2 == 1 && (s[j] - '0') % 2 == 0) {flag = 1;break;}}}// 如果flag没有被设置,说明当前的数是一个“好数”if(flag == 0)ans++; // 好数的数量加1}cout << ans; // 输出总的好数的数量return 0;    // 程序结束
}

这段代码通过将数字转换成字符串的形式,然后检查字符串的每个字符来判断一个数是否符合“好数”的定义。代码中的flag变量用来表示当前检查的数是否已经确定不是“好数”。如果在检查过程中发现某位数字不符合好数的要求,flag将被设置为1,并终止进一步检查。最终,没有被标记为非好数的数将会被计入最终的答案ans中。

这篇关于好数(蓝桥杯)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905027

相关文章

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式(二)Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码(四⾏代码版本)底层代码(状态机版本) 七、LCD模块1.原理图配置2.知识点底层代码 五、Led模块 1.原理图配置 2. 知识点 链接: 上拉电阻的通俗解释 链接: 单⽚机怎么输出⾼电平!推挽输出和开

蓝桥杯:整数删除

// 蓝桥杯整数删除.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<stdio.h>#define MAX 100void findmin(int a[],int n,int& pos){int min=a[0];pos=0;//pos=0我开始忘了,特别注意

第十五届蓝桥杯图形化省赛题目及解析

第十五届蓝桥杯图形化省赛题目及解析 一. 单选题 1. 运行以下程序,角色会说( )? A、29     B、31     C、33     D、35 正确答案:C 答案解析: 重复执行直到m>n不成立,即重复执行直到m<=n。所有当m小于或者 等于n时,循环结束。循环过程中变量m与变量n的变化如下表: 通过上述表格可知,循环到第五次循环结束。m的值为14,n的值为19

第八届蓝桥杯 最大公共子串(动态规划)

标题:最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分缺失的代码。 #include <stdio.h

蓝桥杯第八届 方格分割(dfs)

标题:方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。   观察可得他是一个中心对称图形,我们只需要搜索它的对称线即可。我们可以把对称线抽象为从(

蓝桥杯备赛day02:递推

斐波那契数列 #include <bits/stdc++.h>using namespace std;int main(){int n;cin>>n;int dp[n+1];dp[1]=1;dp[2]=1;for(int i = 3;i <= n;i++) dp[i] = dp[i-1]+dp[i-2];cout<<dp[n];return 0;} n = int(input())

蓝桥杯入门训练——序列求和

入门训练 序列求和   时间限制:1.0s   内存限制:256.0MB         问题描述 求1+2+3+...+n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值。 样例输入 4 样例输出 10 样例输入 100 说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。 一般在提