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位数,一定小于30for(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库,可以很方便的解决所有时间问题
设置起始时间和终止时间,以及统计值
python">a=date(1949,10,1)
b=date(2012,10,1)
cnt=0
循环判断
满足 是10月 是1号 是周日
(注意a.weekday()
返回的整数范围是 0
到 6
,分别对应星期一到星期日)
日期增加1
python">while a<=b:if a.month==10 and a.day==1 and a.weekday()==6:cnt+=1a+=timedelta(1)
输出结果
python">print(cnt)
答案
9
code
python">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+=1a+=timedelta(1)
print(cnt)