文章目錄 1. REPEAT程序 2. 猜生日 3. 成績統計 4. 乘積尾零 5. 等差數列 6. 合并檢測 7. 回文日期 8. 紀念日 9. 既約分數 10. 門牌制作 11. 年號字符 12. 跑步鍛煉 13. 跑步訓練 14. 平方和 15. 七段數碼管 16. 奇數倍數 17. 刪除字符 18. 蛇形填數 19. 數的分解 20. 數列求值 21. 特別數的和 22. 完全二叉樹的權值 23. 整數序列 24. 質數 25. 走方格 26. 排列字母 27. 日期問題 28. 飲料換購 29. 受傷的皇后 30. 最大降雨量 31. 單詞分析 32. 卡片 33. 空間 34. 時間顯示 35. 分巧克力
1. REPEAT程序
題目描述: 附件 prog.txt 中是一個用某種語言寫的程序。 其中 REPEAT k 表示一個次數為 k 的循環。循環控制的范圍由縮進表達,從次行開始連續的縮進比該行多的(前面的空白更長的)為循環包含的內容。 例如如下片段:
REPEAT
2 ; A
= A
+ 4 ; REPEAT
5 ; REPEAT
6 ; A
= A
+ 5 ; A
= A
+ 7 ; A
= A
+ 8 ;
A
= A
+ 9 ;
該片段中從 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循環兩次中。 REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循環中。 A = A + 5 實際總共的循環次數是 2 × 5 × 6 = 60 次。 請問該程序執行完畢之后,A 的值是多少?
題目分析: 從題目中看出REPEAT就是一個for循環,后面的數字就是循環次數,循環控制的范圍由縮進表達。然后模擬出題就可以
# include <iostream>
using namespace std
; int main ( ) { int A
= 0 ; for ( int i
= 0 ; i
< 2 ; i
++ ) { A
+= 4 ; for ( int j
= 0 ; j
< 5 ; j
++ ) { for ( int k
= 0 ; k
< 6 ; k
++ ) { A
+= 5 ; } A
+= 7 ; } A
+= 8 ; } A
+= 9 ; cout
<< "A = " << A
<< endl
;
}
2. 猜生日
題目描述: 今年的植樹節(2012年3月 12日),小明和他的叔叔還有小伙伴們一起去植樹。休息的時候,小明的同學問他叔叔多大年紀,他叔叔說:“我說個題目,看你們誰先猜出來!” “把我出生的年月日連起來拼成一個8位數(月、日不足兩位前補0)正好可以被今天的年、月、日整除!” 他想了想,又補充到:“再給個提示,我是6月出生的。”根據這些信息,請你幫小明算一下,他叔叔的出生年月日。 格式是年月日連成的8位數。例如,如果是1948年6月12日,就寫:19480612。
# include <iostream>
using namespace std
;
int main ( )
{ for ( int i
= 19000101 ; i
<= 20120312 ; i
++ ) { if ( i
% 2012 == 0 && i
% 3 == 0 && i
% 12 == 0 && i
/ 100 % 100 == 6 && i
% 100 < 32 ) { cout
<< i
; break ; } } return 0 ;
}
3. 成績統計
題目描述: 小藍給學生們組織了一場考試,卷面總分為100分,每個學生的得分都是一個0到100的整數。如果得分至少是60分,則稱為及格。如果得分至少為85分,則稱為優秀。請計算及格率和優秀率,用百分數表示,百分號前的部分四舍五入保留整數。
【輸入格式】 輸入的第一行包含一個整數n,表示考試人數。接下來n行,每行包含一個0至100的整數,表示一個學生的得分。 【輸出格式】 輸出兩行,每行一個百分數,分別表示及格率和優秀率。百分號前的部分四舍五入保留整數。
# include <iostream>
using namespace std
; int main ( ) { int n
, bad
= 0 , good
= 0 , b
, f
; cin
>> n
; int a
[ n
] ; for ( int i
= 0 ; i
< n
; i
++ ) { cin
>> a
[ i
] ; if ( a
[ i
] >= 85 ) { good
++ ; } if ( a
[ i
] >= 60 ) { bad
++ ; } } b
= bad
* 100.0 / n
* 1.0 + 0.5 ; f
= good
* 100.0 / n
* 1.0 + 0.5 ; cout
<< b
<< "%" << endl
; cout
<< f
<< "%" << endl
;
}
4. 乘積尾零
題目描述: 如下的10行數據,每行有10個整數,請你求出它們的乘積的末尾有多少個零?
5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211
# include <iostream>
# include <cmath>
using namespace std
;
int main ( )
{ int a
[ 100 ] = { 5650 , 4542 , 3554 , 473 , 946 , 4114 , 3871 , 9073 , 90 , 4329 , 2758 , 7949 , 6113 , 5659 , 5245 , 7432 , 3051 , 4434 , 6704 , 3594 , 9937 , 1173 , 6866 , 3397 , 4759 , 7557 , 3070 , 2287 , 1453 , 9899 , 1486 , 5722 , 3135 , 1170 , 4014 , 5510 , 5120 , 729 , 2880 , 9019 , 2049 , 698 , 4582 , 4346 , 4427 , 646 , 9742 , 7340 , 1230 , 7683 , 5693 , 7015 , 6887 , 7381 , 4172 , 4341 , 2909 , 2027 , 7355 , 5649 , 6701 , 6645 , 1671 , 5978 , 2704 , 9926 , 295 , 3125 , 3878 , 6785 , 2066 , 4247 , 4800 , 1578 , 6652 , 4616 , 1113 , 6205 , 3264 , 2915 , 3966 , 5291 , 2904 , 1285 , 2193 , 1428 , 2265 , 8730 , 9436 , 7074 , 689 , 5510 , 8243 , 6114 , 337 , 4096 , 8199 , 7313 , 3685 , 211 } ; int cnt2
= 0 , cnt5
= 0 ; for ( int i
= 0 ; i
<= 99 ; i
++ ) { int t
= a
[ i
] ; while ( t
% 2 == 0 ) { cnt2
++ ; t
/= 2 ; } while ( t
% 5 == 0 ) { cnt5
++ ; t
/= 5 ; } } cout
<< min ( cnt2
, cnt5
) << endl
; return 0 ;
}
5. 等差數列
題目描述: 數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一部分的數列,只記得其中N個整數。現在給出這N個整數,小明想知道包含這N個整數的最短的等差數列有幾項?
【輸入描述】 輸入的第一行包含一個整數 N。第二行包含N個整數A1,A2…An 。(注意并不一定是按等差數列中的順序給出) 輸出一個整數表示答案。
# include <iostream>
# include <algorithm>
using namespace std
;
int main ( )
{ int n
, min
= 10000 ; cin
>> n
; long long a
[ n
] ; for ( int i
= 0 ; i
< n
; i
++ ) { cin
>> a
[ i
] ; } sort ( a
, a
+ n
) ; for ( int j
= 0 ; j
< n
- 1 ; j
++ ) { if ( a
[ j
+ 1 ] - a
[ j
] < min
) { min
= a
[ j
+ 1 ] - a
[ j
] ; } } int m
= ( a
[ n
- 1 ] - a
[ 0 ] ) / min
; if ( min
== 0 ) cout
<< n
; else cout
<< m
+ 1 ; return 0 ;
}
6. 合并檢測
題目描述: 新冠疫情由新冠病毒引起,最近在 A 國蔓延,為了盡快控制疫情, A 國準備給大量民眾進病毒核酸檢測。然而,用于檢測的試劑盒緊缺。為了解決這一困難,科學家想了一個辦法:合并檢測。即將從多個人( k 個)采集的標本放到同一個試劑盒中進行檢測。如果結果為陰性,則說明這 k 個人都是陰性,用一個試劑盒完成了 k 個人的檢測。如果結果為陽性,則說明至少有一個人為陽性,需要將這 k 個人的樣本全部重新獨立檢測(從理論上看,如果檢測前 k?1 個人都是陰性可以推斷出第 k 個人是陽性,但是在實際操作中不會利用此推斷,而是將 k 個人獨立檢測),加上最開始的合并檢測,一共使用了 k+1 個試劑盒完成了 k 個人的檢測。
A 國估計被測的民眾的感染率大概是 1,呈均勻分布。請問 k 取多少能最節省試劑盒?
題目分析: 這里概率為1,我們不妨設置測試人員為100,然后就是分類討論k可以被100整除和不可以被整除的情況 可以被100整除 100/k+k 不可以被100整除 100/k+k+1
# include <iostream>
using namespace std
; int main ( ) { int k
, sum
, j
, s
= 1000 , min
, m
, f
; for ( k
= 1 ; k
<= 100 ; k
++ ) { if ( 100 % k
== 0 ) { j
= 100 / k
; sum
= j
+ k
; if ( sum
< s
) { min
= sum
; s
= sum
; f
= k
; } } else { j
= 100 / k
; sum
= j
+ 1 + k
; if ( sum
< s
) { min
= sum
; s
= sum
; f
= k
; } } } cout
<< "最少需要試劑 " << min
<< " 盒,此時以 " << f
<< " 人為一個采集標本" ;
}
7. 回文日期
題目描述: 2020年春節期間,有一個特殊的日期引起了大家的注意:2020年2月2日。因為如果將這個日期按“yyyymmdd”的格式寫成一個8位數是20200202,恰好是一個回文數。我們稱這樣的日期是回文日期。有人表示20200202是“千年一遇”的特殊日子。對此小明很不認同,因為不到2年之后就是下一個回文日期:20211202即2021年12月2日。也有人表示20200202并不僅僅是一個回文日期,還是一個ABABBABA型的回文日期。對此小明也不認同,因為大約100年后就能遇到下一個ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,頂多算“千年兩遇”。給定一個8位數的日期,請你計算該日期之后下一個回文日期和下一個ABABBABA型的回文日期各是哪一天。
【輸入格式】 輸入包含一個八位整數N,表示日期。
【輸出格式】 輸出兩行,每行1個八位數。第一行表示下一個回文日期,第二行表示下一個ABABBABA型的回文日期。
# include <iostream>
using namespace std
; int leap ( int year
) { if ( ( year
% 4 == 0 && year
% 100 != 0 ) || year
% 400 == 0 ) return 1 ;
} int palindromic ( int num
) { int m
, m1
, m2
, m3
, m4
, m5
, m6
, m7
, m8
; m1
= ( num
% 10 ) * 10000000 ; m2
= ( num
/ 10 % 10 ) * 1000000 ; m3
= ( num
/ 100 % 10 ) * 100000 ; m4
= ( num
/ 1000 % 10 ) * 10000 ; m5
= ( num
/ 10000 % 10 ) * 1000 ; m6
= ( num
/ 100000 % 10 ) * 100 ; m7
= ( num
/ 1000000 % 10 ) * 10 ; m8
= num
/ 10000000 ; m
= m1
+ m2
+ m3
+ m4
+ m5
+ m6
+ m7
+ m8
; if ( num
== m
) return 1 ; else return 0 ;
} int main ( ) { int monthes
[ 13 ] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ; int year
, month
, day
, n
, year0
, month0
, day0
, n1
, n2
, n3
, n4
, n5
, n6
, n7
, n8
, m
, m1
, m2
, m3
, m4
, m5
, m6
, m7
, m8
, k1
, k2
, k3
, k4
, k5
, k6
, k7
, k8
; int num
; cin
>> num
; if ( ! palindromic ( num
) ) return 0 ; n1
= ( num
/ 10000000 ) * 1000 ; n2
= ( num
/ 1000000 % 10 ) * 100 ; n3
= ( num
/ 100000 % 10 ) * 10 ; n4
= ( num
/ 10000 % 10 ) ; n5
= ( num
/ 1000 % 10 ) * 10 ; n6
= ( num
/ 100 % 10 ) ; n7
= ( num
/ 10 % 10 ) * 10 ; n8
= ( num
% 10 ) ; year0
= n1
+ n2
+ n3
+ n4
; month0
= n5
+ n6
; day0
= n7
+ n8
; for ( year
= year0
; year
< 10000 ; year
++ ) { if ( leap ( year
) == 1 ) monthes
[ 2 ] = 29 ; else monthes
[ 2 ] = 28 ; for ( month
= month0
; month
< 13 ; month
++ ) { for ( day
= day0
+ 1 ; day
< monthes
[ month
] ; day
++ ) { n
= year
* 10000 + month
* 100 + day
; m1
= ( day
% 10 ) * 10000000 ; m2
= ( day
/ 10 ) * 1000000 ; m3
= ( month
% 10 ) * 100000 ; m4
= ( month
/ 10 ) * 10000 ; m5
= ( year
% 10 ) * 1000 ; m6
= ( year
/ 10 % 10 ) * 100 ; m7
= ( year
/ 100 % 10 ) * 10 ; m8
= year
/ 1000 ; k1
= ( day
% 10 ) ; k2
= ( day
/ 10 ) ; k3
= ( month
% 10 ) ; k4
= ( month
/ 10 ) ; k5
= ( year
% 10 ) ; k6
= ( year
/ 10 % 10 ) ; k7
= ( year
/ 100 % 10 ) ; k8
= year
/ 1000 ; m
= m1
+ m2
+ m3
+ m4
+ m5
+ m6
+ m7
+ m8
; if ( ( n
== m
) && ( k8
== k1
) && ( k6
== k1
) && ( k3
== k1
) && ( k7
== k2
) && ( k5
== k2
) && ( k4
== k2
) ) { cout
<< n
<< endl
; return 0 ; } } } }
}
8. 紀念日
題目描述: 2020 年 7 月 1 日是中國 共 產 黨 成立 99 周年紀念日。 中國 共 產 黨 成立于 1921 年 7 月 23 日。 請問從 1921 年 7 月 23 日中午 12 時到 2020 年 7 月 1 日中午 12 時一共包含多少分鐘?
題目分析: 先計算1922年到2020 年一共多少天,然后減去多余的天數
# include <iostream>
using namespace std
; int main ( ) { int i
, j
, flag
, sum
= 0 ; for ( i
= 1922 ; i
<= 2020 ; i
++ ) { if ( ( i
% 4 == 0 && i
% 100 != 0 ) || i
% 400 == 0 ) { sum
+= 366 ; } else sum
+= 365 ; } sum
-= 22 ; cout
<< sum
* 24 * 60 ;
}
9. 既約分數
題目描述: 如果一個分數的分子和分母的最大公約數是1,這個分數稱為既約分數。例如,3/4,5/2,1/8,7/1都是既約分數。 請問,有多少個既約分數,分子和分母都是1到2020之間的整數(包括1和2020)
題目分析: 暴力搜索,通過最大公約數判斷
# include <iostream>
using namespace std
; int panduan ( int a
, int b
)
{ int c
; if ( a
== 1 && b
== 1 ) return 1 ; if ( a
>= b
) { while ( c
= a
% b
) { a
= b
; b
= c
; } if ( b
== 1 ) return 1 ; else return 0 ; } else { while ( c
= b
% a
) { b
= a
; a
= c
; } if ( a
== 1 ) return 1 ; else return 0 ; }
}
int main ( ) { int sum
= 0 ; for ( int i
= 1 ; i
<= 2020 ; i
++ ) { for ( int j
= 1 ; j
<= 2020 ; j
++ ) { sum
+= panduan ( i
, j
) ; } } cout
<< sum
<< endl
; cout
<< panduan ( 2 , 21 ) ;
}
10. 門牌制作
題目描述: 小藍要為一條街的住戶制作門牌號。這條街一共有2020位住戶,門牌號從1到2020編號。小藍制作門牌的方法是先制作0到9這幾個數字字符,最后根據需要將字符粘貼到門牌上,例如門牌1017需要依次粘貼字符1、0、1、7,即需要1個字符0,2個字符1,1個字符7。 請問要制作所有的1到2020號門牌,總共需要多少個字符2?
# include <iostream>
using namespace std
; int panduan ( int num
) { int sum
= 0 ; while ( num
) { if ( num
% 10 == 2 ) { sum
++ ; } num
= num
/ 10 ; } return sum
;
} int main ( ) { int n
; for ( int i
= 0 ; i
<= 2020 ; i
++ ) { n
+= panduan ( i
) ; } cout
<< n
;
}
11. 年號字符
題目描述: 小明用字母 A對應數字 1,B對應 2,以此類推,用 Z對應 26。對于 27以上的數字,小明用兩位或更長位的字符串來對應,例如 AA對應27,AB對 應28,AZ對應52,LQ對應329。請問2019對應的字符串是什么?
題目分析: 這題就是類似于一個進制轉換,你可以回想一下十進制轉二進制如何轉換,然后再想想將十進制轉化成26進制,口訣就是除p取余
# include <iostream>
# include <stack>
using namespace std
; int main ( ) { int n
= 2019 ; stack
< int > s
; int temp
; while ( n
) { temp
= n
% 26 ; s
. push ( temp
) ; n
/= 26 ; } while ( ! s
. empty ( ) ) { char c
= s
. top ( ) + 64 ; cout
<< c
; s
. pop ( ) ; }
}
12. 跑步鍛煉
題目描述: 小藍每天都鍛煉身體。正常情況下,小藍每天跑1千米。如果某天是周一或者月初(1日),為了激勵自己,小藍要跑2千米。 如果同時是周一或月初,小藍也是跑2千米。小藍跑步已經堅持了很長時間,從2000年1月1日周六(含)到2020年10月1日周四(含)。 請問這段時間小藍總共跑步多少千米?
題目分析: 首先算出總的天數,和月份數,然后求出一共有多少個周一,和周一中為月份的天數最后總天數+周一天數+月初天數 - 周一和月初重合天數
# include <iostream>
using namespace std
; int panduan ( int a
) { if ( ( a
% 4 == 0 && a
% 100 != 0 ) || a
% 400 == 0 ) return 1 ; else return 0 ;
} int main ( ) { int sum
= 0 ; int monthes
[ 13 ] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ; int mon
= 6 ; for ( int year
= 2000 ; year
<= 2020 ; year
++ ) { if ( panduan ( year
) ) monthes
[ 2 ] = 29 ; else monthes
[ 2 ] = 28 ; for ( int month
= 1 ; month
<= 12 ; month
++ ) { for ( int day
= 1 ; day
<= monthes
[ month
] ; day
++ ) { if ( mon
== 8 ) mon
= 1 ; if ( mon
== 1 && day
== 1 ) { sum
+= 2 ; } else if ( mon
== 1 || day
== 1 ) { sum
+= 2 ; } else sum
+= 1 ; if ( year
== 2020 && month
== 10 && day
== 1 ) { cout
<< sum
; return 0 ; } mon
++ ; } } }
}
13. 跑步訓練
題目描述: 小明要做一個跑步訓練。 初始時,小明充滿體力,體力值計為 10000 。如果小明跑步,每分鐘損耗 600 的體力。如果小明休息,每分鐘增加 300 的體力。體力的損耗和增加都是均勻變化的。 小明打算跑一分鐘、休息一分鐘、再跑一分鐘、再休息一分鐘……如此循環。如果某個時刻小明的體力到達 0 ,他就停止鍛煉。 請問小明在多久后停止鍛煉。為了使答案為整數,請以秒為單位輸出答案。答案中只填寫數,不填寫單位。
題目分析: 首先求出每秒的損耗,之后模擬跑步休息的鍛煉過程就可以
# include <iostream>
using namespace std
; int main ( ) { int sum
= 0 ; int N
= 10000 ; while ( N
> 0 ) { N
-= 600 ; sum
+= 60 ; N
+= 300 ; sum
+= 60 ; if ( N
<= 600 ) { sum
+= ( N
/ 10 ) ; break ; } } cout
<< sum
;
}
14. 平方和
題目描述: 小明對數位中含有2、0、1、9的數字很感興趣,在1到40中這樣的數包括1、2、9、10至32、39和40,共28個,他們的和是574,平方和是14362,注意,平方和是指將每個數分別平方后求和。請問,在1到2019中,所有這樣的數的平方和是多少?
# include <iostream>
# include <string>
using namespace std
;
int main ( )
{ long long sum
= 0 ; for ( int i
= 1 ; i
<= 2019 ; i
++ ) { string str
= to_string ( i
) ; if ( str
. find ( "2" ) == - 1 && str
. find ( "0" ) == - 1 && str
. find ( "1" ) == - 1 && str
. find ( "9" ) == - 1 ) continue ; else sum
+= i
* i
; } cout
<< sum
; return 0 ;
}
15. 七段數碼管
題目描述: 小藍要用七段碼數碼管來表示一種特殊的文字。 七段碼上圖給出了七段碼數碼管的一個圖示,數碼管中一共有 7 段可以發光的二極管,分別標記為 a, b,c, d, e, f, g。小藍要選擇一部分二極管(至少要有一個)發光來表達字符。在設計字符的表達時,要求所有發光的二極管是連成一片的。 例如:b 發光,其他二極管不發光可以用來表達一種字符。 例如:c 發光,其他二極管不發光可以用來表達一種字符。這種方案與上一行的方案可以用來表示不同的字符,盡管看上去比較相似。 例如:a, b, c, d, e 發光,f, g 不發光可以用來表達一種字符。
思路: 暴力,最后減去三種特殊情況(暴力判斷不了的情況) 1101100 1011010 0110110
# include <iostream>
using namespace std
; int main ( )
{ int sum
= 0 ; for ( int a
= 0 ; a
<= 1 ; a
++ ) { for ( int b
= 0 ; b
<= 1 ; b
++ ) { for ( int c
= 0 ; c
<= 1 ; c
++ ) { for ( int d
= 0 ; d
<= 1 ; d
++ ) { for ( int e
= 0 ; e
<= 1 ; e
++ ) { for ( int f
= 0 ; f
<= 1 ; f
++ ) { for ( int g
= 0 ; g
<= 1 ; g
++ ) { int s
= a
+ b
+ c
+ d
+ e
+ f
+ g
; if ( s
== 1 ) { sum
++ ; } else if ( s
>= 2 ) { if ( a
== 1 && b
== 0 && f
== 0 ) continue ; else if ( b
== 1 && a
== 0 && c
== 0 && g
== 0 ) continue ; else if ( c
== 1 && b
== 0 && g
== 0 && d
== 0 ) continue ; else if ( d
== 1 && e
== 0 && c
== 0 ) continue ; else if ( e
== 1 && d
== 0 && g
== 0 && f
== 0 ) continue ; else if ( f
== 1 && a
== 0 && e
== 0 && g
== 0 ) continue ; sum
++ ; } } } } } } } } printf ( "%d\n" , sum
- 3 ) ; return 0 ;
}
16. 奇數倍數
題目描述: 請你找到最小的整數X 同時滿足:X是2019的整倍數;X的每一位數字都是奇數。
# include <iostream>
using namespace std
; int main ( )
{ int n1
, n2
, n3
, n4
, n5
, n6
; for ( int i
= 2019 ; ; i
++ ) { n1
= i
% 10 ; n2
= i
/ 10 % 10 ; n3
= i
/ 100 % 10 ; n4
= i
/ 1000 % 10 ; n5
= i
/ 10000 % 10 ; n6
= i
/ 100000 % 10 ; if ( i
% 2019 == 0 && n1
% 2 == 1 && n2
% 2 == 1 && n3
% 2 == 1 && n4
% 2 == 1 && n5
% 2 == 1 && n6
% 2 == 1 ) { cout
<< i
; return 0 ; } } return 0 ;
}
17. 刪除字符
題目描述: 給定一個單詞,請問在單詞中刪除t個字母后,能得到的字典序最小的單詞是什么?
【輸入描述】 輸入的第一行包含一個單詞,由大寫英文字母組成。 第二行包含一個正整數 t。其中,單詞長度不超過100,t小于單詞長度。 【輸出描述】 輸出一個單詞,表示答案。
# include <iostream>
# include <string>
using namespace std
;
int main ( )
{ string str
; int n
; cin
>> str
; cin
>> n
; int f
= str
. length ( ) - 1 ; while ( n
-- ) { for ( int i
= 0 ; i
< str
. length ( ) - 1 ; i
++ ) { if ( str
[ i
] > str
[ i
+ 1 ] ) { f
= i
; break ; } } str
[ f
] = '0' ; } for ( int j
= 0 ; j
< str
. length ( ) ; j
++ ) { if ( str
[ j
] != '0' ) cout
<< str
[ j
] ; } return 0 ;
}
18. 蛇形填數
題目描述: 如下圖所示,小明用從1開始的正整數“蛇形”填充無限大的矩陣。 容易看出矩陣第二行第二列中的數是5。請你計算矩陣中第20行第20列的數是多少? 1 2 6 7 15 … 3 5 8 14 … 4 9 13 … 10 12 … 11 …
題目分析: 可以將圖形順時針旋轉45度,我們可以發現20行20列應該位于第49層的中間一個,然后模擬就可以算出來了
1 行
1 列
1 3 2 + 4
2 行
2 列
4 5 6 10 9 8 7 + 8
3 行
3 列
11 12 13 14 15 16 17 18 19 20 21 + 12
4 行
4 列
22 23 24 25 26 27 28
# include <iostream>
using namespace std
; int main ( ) { int m
= 1 ; for ( int i
= 0 ; i
< 20 ; i
++ ) { m
+= 4 * i
; } cout
<< m
;
}
19. 數的分解
題目描述: 把 2019分解成 3個各不相同的正整數之和,并且要求每個正整數都不包 含數字2和4,一共有多少種不同的分解方法? 注意交換 3個整數的順序被視為同一種方法,例如 1000+1001+18和 1001+1000+18被視為同一種。
# include <iostream>
using namespace std
; bool check ( int n
) { for ( int i
= 0 ; n
!= 0 ; i
++ ) { if ( n
% 10 == 2 || n
% 10 == 4 ) return false ; else n
/= 10 ; } return true ;
} int main ( )
{ int num
= 0 ; for ( int num1
= 1 ; num1
<= 2019 / 3 ; num1
++ ) { if ( check ( num1
) ) { for ( int num2
= num1
+ 1 ; num2
<= ( 2019 - num1
) / 2 ; num2
++ ) { if ( check ( num2
) ) { int num3
= 2019 - num1
- num2
; if ( check ( num3
) && num3
> num2
) num
++ ; } } } } cout
<< num
; return 0 ;
}
20. 數列求值
題目描述: 給定數列1,1,1,3,5,9,17,…,從第4項開始,每項都是前3項的和。求 第20190324項的最后4位數字。
題目分析: 應為保留最后四位數字,所以每次計算過后需要用10000取余,不然會溢出
# include <iostream>
using namespace std
; int main ( ) { int n0
= 0 , n1
= 1 , n2
= 1 , n3
= 1 , n
= 3 ; long long int s
= 0 ; while ( n
) { s
= n1
+ n2
+ n3
; s
%= 10000 ; n1
= n2
; n2
= n3
; n3
= s
; n
++ ; if ( n
== 20190324 ) break ; } cout
<< s
;
}
21. 特別數的和
題目描述: 小明對數位中含有 2、0、1、9 的數字很感興趣(不包括前導 0) ,在 1 到40 中這樣的數包括 1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。請問,在 1 到 n 中,所有這樣的數的和是多少?
【輸入格式】 輸入一行包含兩個整數 n。 【輸出格式】 輸出一行,包含一個整數,表示滿足條件的數的和。
# include <iostream>
using namespace std
; int main ( ) { int n0
, n1
, n2
, n3
, n4
, sum
= 0 , num
= 0 , N
, Num
= 0 ; cin
>> N
; n0
= N
; while ( n0
) { Num
++ ; n0
/= 10 ; } for ( int i
= 1 ; i
<= N
; i
++ ) { if ( Num
== 4 ) { if ( i
< 10 ) { n1
= i
% 10 ; if ( n1
== 0 || n1
== 1 || n1
== 2 || n1
== 9 ) { sum
+= i
; num
++ ; } } else if ( i
>= 10 && i
< 100 ) { n1
= i
/ 10 % 10 ; n2
= i
% 10 ; if ( ( n1
== 0 || n1
== 1 || n1
== 2 || n1
== 9 ) || ( n2
== 0 || n2
== 1 || n2
== 2 || n2
== 9 ) ) { sum
+= i
; num
++ ; } } else if ( i
>= 100 && i
< 1000 ) { n1
= i
/ 100 % 10 ; n2
= i
/ 10 % 10 ; n3
= i
% 10 ; if ( ( n1
== 2 || n1
== 0 || n1
== 1 || n1
== 9 ) || ( n2
== 2 || n2
== 0 || n2
== 1 || n2
== 9 ) || ( n3
== 2 || n3
== 0 || n3
== 1 || n3
== 9 ) ) { sum
+= i
; num
++ ; } } else { n1
= i
/ 1000 % 10 ; n2
= i
/ 100 % 10 ; n3
= i
/ 10 % 10 ; n4
= i
% 10 ; if ( ( n1
== 2 || n1
== 0 || n1
== 1 || n1
== 9 ) || ( n2
== 2 || n2
== 0 || n2
== 1 || n2
== 9 ) || ( n3
== 2 || n3
== 0 || n3
== 1 || n3
== 9 ) || ( n4
== 2 || n4
== 0 || n4
== 1 || n4
== 9 ) ) { sum
+= i
; num
++ ; } } } else if ( Num
== 3 ) { if ( i
< 10 ) { n1
= i
% 10 ; if ( n1
== 0 || n1
== 1 || n1
== 2 || n1
== 9 ) { sum
+= i
; num
++ ; } } else if ( i
>= 10 && i
< 100 ) { n1
= i
/ 10 % 10 ; n2
= i
% 10 ; if ( ( n1
== 0 || n1
== 1 || n1
== 2 || n1
== 9 ) || ( n2
== 0 || n2
== 1 || n2
== 2 || n2
== 9 ) ) { sum
+= i
; num
++ ; } } else { n1
= i
/ 100 % 10 ; n2
= i
/ 10 % 10 ; n3
= i
% 10 ; if ( ( n1
== 2 || n1
== 0 || n1
== 1 || n1
== 9 ) || ( n2
== 2 || n2
== 0 || n2
== 1 || n2
== 9 ) || ( n3
== 2 || n3
== 0 || n3
== 1 || n3
== 9 ) ) { sum
+= i
; num
++ ; } } } else if ( Num
== 2 ) { if ( i
< 10 ) { n1
= i
% 10 ; if ( n1
== 0 || n1
== 1 || n1
== 2 || n1
== 9 ) { sum
+= i
; num
++ ; } } else { n1
= i
/ 10 % 10 ; n2
= i
% 10 ; if ( ( n1
== 0 || n1
== 1 || n1
== 2 || n1
== 9 ) || ( n2
== 0 || n2
== 1 || n2
== 2 || n2
== 9 ) ) { sum
+= i
; num
++ ; } } } else if ( Num
== 1 ) { n1
= i
% 10 ; if ( ( n1
== 2 || n1
== 0 || n1
== 1 || n1
== 9 ) ) { sum
+= i
; num
++ ; } } } cout
<< sum
<< endl
;
}
22. 完全二叉樹的權值
題目描述: 數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一 部分的數列,只記得其中 N 個整數。現在給出這 N 個整數,小明想知道包含這 N 個整數的最短的等差數列有幾項?
【輸入格式】 輸入的第一行包含一個整數 N。 第二行包含 N 個整數 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ~ A N 并不一定是按等差數列中的順序給出) 【輸出格式】 輸出一個整數表示答案。
# include <iostream>
# include <cmath>
using namespace std
; int main ( ) { int depthes
[ 1000 ] = { 0 } , N
, depth
, sd
[ 100 ] = { 0 } , max
= 0 , f
, h
; cin
>> N
; depth
= ceil ( log2 ( N
+ 1 ) ) ; for ( int i
= 1 ; i
<= N
; i
++ ) { cin
>> depthes
[ i
] ; } for ( int j
= 1 ; j
<= N
; j
++ ) { h
= ceil ( log2 ( j
+ 1 ) ) ; sd
[ h
] += depthes
[ j
] ; } for ( int k
= 1 ; k
<= depth
; k
++ ) { if ( sd
[ k
] > max
) { max
= sd
[ k
] ; f
= k
; } } cout
<< f
<< endl
;
}
23. 整數序列
題目描述: 有一個序列,序列的第一個數是 n,后面的每個數是前一個數整除 2,請輸出這個序列中值為正數的項。
【輸入格式】 輸入一行包含一個整數 n。 【輸出格式】 輸出一行,包含多個整數,相鄰的整數之間用一個空格分隔,表示答案。
【評測用例規模與約定】 對于 80% 的評測用例,1≤n≤109。 對于所有評測用例,1≤n≤1018。
# include <iostream>
# include <string.h>
using namespace std
; int main ( ) { int a
[ 100 ] , j
= 0 , i
, s
; cin
>> i
; while ( i
) { a
[ j
] = i
/ 2 ; i
= i
/ 2 ; j
++ ; s
++ ; } for ( int m
= 0 ; m
< s
- 2 ; m
++ ) { cout
<< a
[ m
] ; if ( a
[ m
+ 1 ] != 0 ) cout
<< "," ; }
}
24. 質數
題目描述: 我們知道第一個質數是2、第二個質數是 3第三個質數是5… 請你計算第2019個質數是多少?
# include <iostream>
using namespace std
;
int main ( )
{ int flag
= 0 ; int num
= 2 ; for ( int i
= 5 ; i
< 20000 ; i
++ ) { flag
= 0 ; for ( int j
= 2 ; j
< i
; j
++ ) { if ( i
% j
== 0 ) { flag
= 1 ; break ; } } if ( flag
== 0 ) { num
++ ; if ( num
== 2019 ) cout
<< i
; } } return 0 ;
}
25. 走方格
題目描述: 在平面上有一些二維的點陣。 這些點的編號就像二維數組的編號一樣,從上到下依次為第 1 至第 n 行,從左到右依次為第 1 至第 m 列,每一個點可以用行號和列號來表示。 現在有個人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行號和列數都是偶數,不能走入這一格中。 問有多少種方案。
【輸入格式】 輸入一行包含兩個整數 n, m。
【輸出格式】 輸出一個整數,表示答案。
【評測用例規模與約定】 對于所有評測用例,1≤n≤30,1≤m≤30。
# include <iostream>
using namespace std
; int main ( ) { int n
, m
, i
, j
; int a
[ 35 ] [ 35 ] ; cin
>> n
>> m
; for ( i
= 0 ; i
< n
; i
++ ) a
[ i
] [ 0 ] = 1 ; for ( j
= 0 ; j
< m
; j
++ ) a
[ 0 ] [ j
] = 1 ; for ( i
= 1 ; i
< n
; i
++ ) { for ( j
= 1 ; j
< m
; j
++ ) { if ( ( i
+ 1 ) % 2 == 0 && ( j
+ 1 ) % 2 == 0 ) a
[ i
] [ j
] = 0 ; else a
[ i
] [ j
] = a
[ i
- 1 ] [ j
] + a
[ i
] [ j
- 1 ] ; } } cout
<< a
[ n
- 1 ] [ m
- 1 ] ;
}
26. 排列字母
問題描述: 小藍要把一個字符串中的字母按其在字母表中的順序排列。 例如,LANQIAO排列后為AAILNOQ。 又如,GOODGOODSTUDYDAYDAYUP排列后為AADDDDDGGOOOOPSTUUYYY。 請問對于以下字符串,排列之后字符串是什么? WHERETHEREISAWILLTHEREISAWAY
# include <iostream>
# include <string>
# include <algorithm>
using namespace std
;
int main ( )
{ string s
; cin
>> s
; sort ( s
. begin ( ) , s
. end ( ) ) ; cout
<< s
; return 0 ;
}
27. 日期問題
題目描述: 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期采用的格式非常不統一,有采用年/月/日的,有采用月/日/年的,還有采用日/月/年的。更加麻煩的是,年份也都省略了前兩位,使得文獻上的一個日期,存在很多可能的日期與其對應。比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。 給出一個文獻上的日期,你能幫助小明判斷有哪些可能的日期對其對應嗎?
【輸入描述】 —個日期,格式是"AA/BB/CC"(0≤A,B,C≤9)。 【輸出描述】 輸出若干個不相同的日期,每個日期一行,格式是"yyyy—MM —dd"。多個日期按從早到晚排列。
# include <cstdio>
# include <cstring>
# include <iostream>
# include <algorithm>
# include <cmath>
using namespace std
; int days
[ 13 ] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ; bool check ( int year
, int month
, int day
)
{ if ( month
== 0 || month
> 12 ) return false ; if ( day
== 0 ) return false ; if ( month
!= 2 ) { if ( day
> days
[ month
] ) return false ; } else { int leap
= ( year
% 4 == 0 && year
% 100 != 0 ) || ( year
% 400 == 0 ) ; if ( day
> 28 + leap
) return false ; } return true ;
} int main ( )
{ int a
, b
, c
; scanf ( "%d/%d/%d" , & a
, & b
, & c
) ; for ( int i
= 19600101 ; i
<= 20591231 ; i
++ ) { int year
= i
/ 10000 ; int month
= i
/ 100 % 100 ; int day
= i
% 100 ; if ( check ( year
, month
, day
) ) { if ( year
% 100 == a
&& month
== b
&& day
== c
|| month
== a
&& day
== b
&& year
% 100 == c
|| day
== a
&& month
== b
&& year
% 100 == c
) printf ( "%d-%02d-%02d\n" , year
, month
, day
) ; } } return 0 ;
}
28. 飲料換購
題目描述: 樂羊羊飲料廠正在舉辦一次促銷優惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,并且可以一直循環下去(但不允許暫借或賒賬)。 請你計算一下,如果小明不浪費瓶蓋,盡量地參加活動,那么,對于他初始買入的n瓶飲料,最后他一共能喝到多少瓶飲料。
【輸入描述】 輸入一個整數n(0<n<1000),表示開始購買的飲料數量。 【輸出描述】 輸出一個整數,表示實際得到的飲料數
# include <iostream>
using namespace std
;
int main ( )
{ int num1
= 0 , num2
; int n
; cin
>> n
; num2
= n
; while ( n
>= 3 ) { n
-= 2 ; num1
++ ; } cout
<< num1
+ num2
; return 0 ;
}
29. 受傷的皇后
題目描述: 有一個n ×nr的國際象棋棋盤(n行n列的方格圖),請在棋盤中擺放n個受傷的國際象棋皇后,要求: 1.任何兩個皇后不在同一行。 2.任何兩個皇后不在同一列。 3.如果兩個皇后在同一條45度角的斜線上,這兩個皇后之間行號的差值至少為3。 請問一共有多少種擺放方案。
【輸入描述】 輸入的第一行包含一個整數n。其中,1≤n ≤ 10。 【輸出描述】 輸出一個整數,表示答案。
# include <iostream>
using namespace std
;
int main ( )
{ int n
; cin
>> n
; if ( n
== 1 || n
== 2 ) { cout
<< 1 ; } else if ( n
== 3 || n
== 4 ) { cout
<< 2 ; } else if ( n
== 5 || n
== 6 ) { cout
<< 5 ; } else if ( n
== 7 || n
== 8 ) { cout
<< 7 ; } else if ( n
== 9 || n
== 10 ) { cout
<< 9 ; } return 0 ;
}
30. 最大降雨量
題目描述: 本題為填空題,只需要算出結果后,在代碼中使用輸出語句將所填結果輸出即可。由于沙之國長年干旱,法師小明準備施展自己的一個神秘法術來求雨。這個法術需要用到他手中的49張法術符,上面分別寫著1至49這49個數字。法術一共持續7周,每天小明都要使用一張法術符,法術符不能重復使用。每周,小明施展法術產生的能量為這周7張法術符上數字的中位數。法術施展完7周后,求雨將獲得成功,降雨量為7周能量的中位數。由于干早太久,小明希望這次求雨的降雨量盡可能大,請大最大值是多少?
# include <iostream>
using namespace std
;
int main ( )
{
cout
<< 34 << endl
;
}
31. 單詞分析
題目描述: 小藍正在學習一門神奇的語言,這門語言中的單詞都是由小寫英文字母組成,有些單詞很長,遠遠超過正常英文單詞的長度。小藍學了很長時間也記不住一些單詞,他準備不再完全記憶這些單詞,而是根據單詞中哪個字母出現得最多來分辨單詞。 現在,請你幫助小藍,給了一個單詞后,幫助他找到出現最多的字母和這個字母出現的次數。
【輸入描述】 輸入一行包含一個單詞,單詞只由小寫英文字母組成。 對于所有的評測用例,輸入的單詞長度不超過1000。 【輸出描述】 輸出兩行,第一行包含一個英文字母,表示單詞中出現得最多的字母是哪個。如果有多個字母出現的次數相等,輸出字典序最小的那個。第二行包含一個整數,表示出現得最多的那個字母在單詞中出現的次數。
# include <bits/stdc++.h>
using namespace std
;
int c
[ 26 ] ;
int main ( )
{ string a
; char max
; int maxcount
= 0 ; cin
>> a
; for ( int i
= 0 ; i
< a
. length ( ) ; i
++ ) { c
[ a
[ i
] - 97 ] ++ ; } for ( int i
= 0 ; i
< 26 ; i
++ ) { if ( c
[ i
] > maxcount
) { maxcount
= c
[ i
] ; max
= i
+ 97 ; } } cout
<< max
<< endl
<< maxcount
<< endl
; return 0 ;
}
32. 卡片
題目描述: 本題為填空題,只需要算出結果后,在代碼中使用輸出語句將所填結果輸出即可。 小藍有很多數字卡片,每張卡片上都是數字0到9。小藍準備用這些卡片來拼一些數,他想從1開始拼出正整數,每拼一個,就保存起來,卡片就不能用來拼其它數了。小藍想知道自己能從1拼到多少。例如,當小藍有30張卡片,其中0到9各3張,則小藍可以拼出1到10,但是拼11時卡片1已經只有一張了,不夠拼出11。 現在小藍手里有0到9的卡片各2021張,共20210張,請問小藍可以從1拼到多少?
分析: 因為1是排在最前面的,我們可以想出來1是最先進行消耗完畢的,所以我們只要記錄下來1最后用盡的那一數是多少,我們可以使用一個while循環把1消耗進行記錄下來,就是遞減,出現1就遞減1,等于0的時候就是我們需要的那一解
# include <iostream>
using namespace std
; int main ( )
{ long int i
= 0 ; long int sum
= 2021 , tmp
= 0 ; long int b
= 0 ; for ( i
= 1 ; i
< 20210 ; i
++ ) { tmp
= i
; while ( tmp
) { b
= tmp
% 10 ; if ( b
== 1 && sum
> 0 ) { sum
-= 1 ; } tmp
/= 10 ; } if ( sum
== 0 ) { break ; } } cout
<< i
; return 0 ;
}
33. 空間
題目描述: 小藍準備用256MB的內存空間開一個數組,數組的每個元素都是32位二進制整數,如果不考慮程序占用的空間和維護內存需要的輔助空間,請問256MB的空間可以存儲多少個32位二進制整數?
# include <iostream>
using namespace std
;
int main ( )
{ cout
<< ( long long ) 256 * 1024 * 1024 * 8 / 32 ; return 0 ;
}
34. 時間顯示
題目描述: 小藍要和朋友合作開發一個時間顯示的網站。 在服務器上,朋友已經獲取了當前的時間,用一個整數表示,值為從1970年1月1日00 : 00 : 00到當前時刻經過的毫秒數。現在,小藍要在客戶端顯示出這個時間。小藍不用顯示出年月日,只需要顯示出時分秒即可,毫秒也不用顯示,直接舍去即可。給定一個用整數表示的時間,請將這個時間對應的時分秒輸出。
【輸入描述】 輸入一行包含一個整數,表示時間。 【輸出描述】 輸出時分秒表示的當前時間,格式形如HH:MM:Ss,其中出表示時,值為0到23,AM表示分,值為0到59,ss表示秒,值為0到59。時、分、秒不足兩位時補前導0。
# include <iostream>
using namespace std
;
int main ( )
{ long long int h
; cin
>> h
; int hh
, mm
, ss
; h
= h
% ( 24 * 60 * 60 * 1000 ) ; hh
= h
/ ( 60 * 60 * 1000 ) % 24 ; mm
= h
/ ( 60 * 1000 ) % 60 ; ss
= h
/ ( 1000 ) % 60 ; printf ( "%02d:%02d:%02d\n" , hh
, mm
, ss
) ; return 0 ;
}
35. 分巧克力
題目描述:
兒童節那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。 小明一共有Ⅳ塊巧克力,其中第i塊是H;× Wi的方格組成的長方形。為了公平起見, 小明需要從這N塊巧克力中切出K塊巧克力分給小朋友們。切出的巧克力需要滿足: 1.形狀是正方形,邊長是整數; 2.大小相同; 例如一塊6x5的巧克力可以切出6塊2x2的巧克力或者2塊3x3的巧克力。 當然小朋友們都希望得到的巧克力盡可能大,你能幫小明計算出最大的邊長是多少么?
【輸入描述】 第一行包含兩個整數N, K (1≤N,K ≤105)。 以下N行每行包含兩個整數H,Wi (1 ≤H, W;≤105)。 輸入保證每位小朋友至少能獲得一塊1x1的巧克力。 【輸出描述】 輸出切出的正方形巧克力最大可能的邊長。
# include <iostream>
using namespace std
;
int L
[ 100005 ] ;
int W
[ 100005 ] ;
int main ( )
{ int N
, K
; cin
>> N
>> K
; for ( int i
= 1 ; i
<= N
; i
++ ) cin
>> L
[ i
] >> W
[ i
] ; int i
= 10000 ; while ( true ) { int sum
= 0 , num1
, num2
; for ( int j
= 1 ; j
<= N
; j
++ ) { num1
= L
[ j
] / i
; num2
= W
[ j
] / i
; sum
+= num1
* num2
; } if ( sum
>= K
) break ; i
-- ; } cout
<< i
; return 0 ;
}
總結
以上是生活随笔 為你收集整理的蓝桥杯C/C++程序设计 往届真题汇总(基础篇) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。