当前位置: 首页 > article >正文

【蓝桥杯速成】| 1.暴力解题

1高频考点与暴力解题_哔哩哔哩_bilibili

感谢up主分享,以下内容是学习笔记,以c++为主,部分python


题目一:维纳的年龄

题目内容

美国数学家维纳(N.Wiener)智力早熟,
11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要会议,年轻的脸孔引人注目。
于是有人询问他的年龄,
他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。
这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 
请编程输出当年维纳的年龄。

解题步骤

利用暴力法枚举得到维纳的年龄,

先对大致范围做一个确定

立方为4位数,一定大于10,

4次方为6位数,一定小于30

所以外层循环为

for(int i=10;i<30;i++){

	} 

 再求出年龄的立方和四次方,保险起见用long long

    long long cube=(long long)i*i*i;
    long long forth=(long long)i*i*i*i;

 再做检查,进一步缩小范围,以此为内层条件

    if(cube>1000 && cube<10000 && forth>100000 && forth<1000000){
    }

 利用自定义函数检查是否包含0~9

可以把立方和四次方转为字符串,再用字符串的sort方法排序,方便挨个检查

这样可以不用字典之类的统计次数啥的,比较简单

bool isunique(long long cube,long long forth){
	//把两个数字转为字符串并且拼接 
	string s=to_string(cube)+to_string(forth);
	//调用字符串函数进行排序,方便检查 
	sort(s.begin(),s.end());
	//逐个检查 
	for(int i=0;i<10;i++){
		if(s[i]!='0'+i)	return false;
	}
	return true;
}

如果符合要求在主函数中打印输出,可以再看看是否正确

cout<<i<<" "<<cube<<" "<<forth;

答案

18岁 

 code

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

bool isunique(long long cube,long long forth){
	//把两个数字转为字符串并且拼接 
	string s=to_string(cube)+to_string(forth);
	//调用字符串函数进行排序,方便检查 
	sort(s.begin(),s.end());
	//逐个检查 
	for(int i=0;i<10;i++){
		if(s[i]!='0'+i)	return false;
	}
	return true;
}
int main(){
	//使用暴力枚举
	//先确定大致范围,立方为4位数,一定大于10,
	//4次方为6位数,一定小于30
	for(int i=10;i<30;i++){
		//求出这该4位数和6位数
		long long cube=(long long)i*i*i;
		long long forth=(long long)i*i*i*i;
		//再做检查 
		if(cube>1000 && cube<10000 && forth>100000 && forth<1000000){
			//调用函数检查是否包含0~9 
			if(isunique(cube,forth))
			//结果输出再检查一下! 
			cout<<i<<" "<<cube<<" "<<forth;
		}
	} 
	return 0;
}

 题目二:小明的妹妹

题目内容

小明带两个妹妹参加元宵灯会。
别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。
小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”
请你写出:小明的较小的妹妹的年龄。

解题步骤

 用两个int型变量表示两人年龄,初定范围1~50岁

int x,y;//x为较小的妹妹 
for(x=1;x<100;x++){//给定年龄合适区间

年龄差不超过8岁就从8岁开始倒推

y=x+8;//相差不超过8岁 
for(;y>x;y--){

逐个检查年龄之积是年龄之和的6倍

if(x*y==6*(x+y))//年龄之积是年龄之和的6倍
	cout<<x<<" "<<y;//输出检查 

答案

10

code

#include<iostream>
using namespace std;
int main(){
	int x,y;//x为较小的妹妹 
	for(x=1;x<50;x++){//给定年龄合适区间 
		y=x+8;//相差不超过8岁 
		for(;y>x;y--){
			if(x*y==6*(x+y))//年龄之积是年龄之和的6倍
				cout<<x<<" "<<y;//输出检查 
		}
	}
}

题目三:制作门牌

题目内容

小蓝要为一条街的住户制作门牌号。
这条街一共有2020 位住户,门牌号从1 到2020 编号。
小蓝制作门牌的方法是先制作0 到9 这几个数字字符,
最后根据需要将字符粘贴到门牌上,
例如门牌1017 需要依次粘贴字符1、0、1、7,即需要1 个字符0,2 个字符1,1 个字符7。
请问要制作所有的1 到2020 号门牌,总共需要多少个字符2? 

解题步骤

利用好字符串内置函数解题嘎嘎快

从1开始到2020,把数字转为字符串

for(int i=1;i<2021;i++){
		string s=to_string(i);

统计2出现次数

count(s.begin(),s.end(),'2');

累计得出结果

int sum;
sum+=count(s.begin(),s.end(),'2');

答案

624

code

#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
	int sum;
	for(int i=1;i<2021;i++){
		string s=to_string(i);
		sum+=count(s.begin(),s.end(),'2');
	}
	cout<<sum;
	return 0;
}

 


问题四:国庆节是星期日

问题内容

1949年的国庆节(10月1日)是星期六。
今年(2012)的国庆节是星期一。
那么,从建国到现在,有几次国庆节正好是星期日呢?

解题步骤

使用python中的datetime库,可以很方便的解决所有时间问题

设置起始时间和终止时间,以及统计值

a=date(1949,10,1)
b=date(2012,10,1)
cnt=0

循环判断

满足 是10月  是1号  是周日

(注意a.weekday() 返回的整数范围是 0 到 6,分别对应星期一到星期日)

日期增加1

while a<=b:
    if a.month==10 and a.day==1 and a.weekday()==6:
        cnt+=1
    a+=timedelta(1)

输出结果

print(cnt)

 

答案

9

code

from datetime import *
a=date(1949,10,1)
b=date(2012,10,1)
cnt=0
while a<=b:
    if a.month==10 and a.day==1 and a.weekday()==6:
        cnt+=1
    a+=timedelta(1)
print(cnt)


http://www.kler.cn/a/584304.html

相关文章:

  • 音视频入门基础:RTP专题(17)——音频的SDP媒体描述
  • NVIDIA k8s-device-plugin源码分析与安装部署
  • 要登录的设备ip未知时的处理方法
  • 浅谈 JavaScript 对象:属性、方法与创建模式
  • MySql学习_基础Sql语句
  • 记录一个SQL自动执行的html页面
  • Mistral OCR:重新定义文档理解的下一代OCR技术
  • 课堂练习 1:配置虚拟主机
  • TCP协议支持全双工原因TCP发送接收数据是生产者消费者模型
  • JAVA-Thread类实现多线程
  • 【NLP 33、实践 ⑦ 基于Triple Loss作表示型文本匹配】
  • 数字化新零售与 AI 大模型,如何重塑大健康赛道?​
  • IDE 使用技巧与插件推荐:全面提升开发效率
  • ESP32移植Openharmony外设篇(10)inmp441麦克风
  • 基于PyTorch通信算子的分布式训练阻塞定位方法
  • 算法手记3
  • 算法日记40:最长上升子序列LIS(单调栈优化)n*log^n
  • DeepSeek一键生成可视化看板
  • 3.12-1 html讲解
  • QQuick-Binding的介绍