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庫,可以很方便的解決所有時間問題
設置起始時間和終止時間,以及統計值
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+=1a+=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+=1a+=timedelta(1)
print(cnt)