蓝桥杯练习系统[C++]
目錄
數學
1084 用篩法求n以內的素數
1446 核桃的數量
1464 分解質因數
枚舉
1022 篩選N以內的素數
1141 百錢百雞問題
1199 哥德巴赫曾猜測
1259 送分題素數
遞歸
1004 母牛的故事
1463 Sine之舞
1508 和最大子序列
1575 遞歸倒置字符數組
1544 特殊的質數肋骨
動態規劃
1557 聰明的旅行家
1610 傳球游戲(錯誤8)
1633 數的統計
進制
1572 進制轉換(答案錯誤27)
1934 十進制數轉八進制數
2619 二進制問題(時間超限27)
2080 十六進制轉八進制
2082 十六進制轉十進制?
2083 十進制轉十六進制?(答案錯誤45)
?2218 二進制數數(答案錯誤17)
2248 輸出二進制表示?
模擬
1429 蘭頓螞蟻(答案錯誤25)
1480 模擬計算器(答案錯誤82)
1481 剪刀石頭布(答案錯誤80)?
數學
1084 用篩法求n以內的素數
題目描述
用篩法求之N內的素數。
輸入
N
輸出
0~N的素數
樣例輸入復制
100樣例輸出復制
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97題目分析:
篩法解釋
給定一列數組,假設是1~25:
第一步
列出2以后的所有序列:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
第二步
標出序列中的第一個素數,也就是2,序列變成:
2?3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
將剩下序列中,劃掉2的倍數(用刪除線標出),序列變成:
2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25
如果現在這個序列中最大數小于最后一個標出的素數的平方,那么剩下的序列中所有的數都是素數,否則回到第二步。
本例中,因為25大于2的平方,我們返回第二步:
剩下的序列中第一個素數是3,將主序列中3的倍數劃出(刪除線),主序列變成:
2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25
我們得到的素數有:2,3
25仍然大于3的平方,所以我們還要返回第二步:
現在序列中第一個素數是5,同樣將序列中5的倍數劃出,主序列成了:
2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25
我們得到的素數有:2 3 5 11 13 17 23 。
因為25等于5的平方,跳出循環.
在本題中,可根據數值來確定刪去倍數;
若n=100,則用篩法篩到11
若n=10,則用篩法篩到4
代碼運算:
#include<iostream> using namespace std;int main() {int n;cin>>n;for(int i=2;i<=n;i++){if(i==2||i==3||i==5||i==7||i==11||i%2!=0&&i%3!=0&&i%5!=0&&i%7!=0&&i%11!=0){cout<<i<<endl;}}return 0; }?運行結果:
備注:這種方法在n較小時可用,較大時就麻煩了?
1446 核桃的數量
題目描述
小張是軟件項目經理,他帶領3個開發組。工期緊,今天都在加班呢。為鼓舞士氣,小張打算給每個組發一袋核桃(據傳言能補腦)。他的要求是:
1.? 各組的核桃數量必須相同
2.? 各組內必須能平分核桃(當然是不能打碎的)
3.? 盡量提供滿足1,2條件的最小數量(節約鬧革命嘛)
?
輸入
輸入包含三個正整數a,? b,? c,表示每個組正在加班的人數,用空格分開(a,b,c< 30)??
輸出
輸出一個正整數,表示每袋核桃的數量。
樣例輸入復制
2 4 5樣例輸出復制
20?題目分析:
不用理這么多,要想滿足題目要求,只需要核桃的數量同時滿足三個科室整除即可
代碼運算:
#include<iostream> using namespace std;int main() {int a,b,c;cin>>a>>b>>c;for(int i=1;;i++){if(i%a==0&&i%b==0&&i%c==0){cout<<i;break;}}return 0; }運行結果:?
1464 分解質因數
題目描述
求出區間[a,b]中所有整數的質因數分解。
提示
先篩出所有素數,然后再分解。
?
輸入
輸入兩個整數a,b。?
2< =a< =b< =10000
輸出
每行輸出一個數的分解,形如k=a1*a2*a3...(a1< =a2< =a3...,k也是從小到大的)(具體可看樣例)?
樣例輸入復制
3 10樣例輸出復制
3=3 4=2*2 5=5 6=2*3 7=7 8=2*2*2 9=3*3 10=2*5分析:
先判斷是否是素數,再進行質因數分解
if (k <= 2) return false;else{for (int i = 2; i * i <= k; i++) //考慮9=3*3的情況{if (k % i == 0)return false;}return true;}代碼:
#include<iostream> using namespace std; bool Zhishu(int k) {if (k <= 2) return false;else{for (int i = 2; i * i <= k; i++){if (k % i == 0)return false;}return true;} } void Fenjie(int k) {if (Zhishu(k)){cout << k << "=" << k;}else{cout << k << "=";for (int i = 2; i <= k; i++){if (k % i == 0){cout << i;k /= i;if (k != 1)cout << "*";elsebreak;i--; /如/8=2*2*2的情況}}} } int main() {int a, b;cin >> a >> b;for (int i = a; i <= b; i++){Fenjie(i);cout << endl;}return 0; }運行結果:
枚舉
1022 篩選N以內的素數
題目描述
用簡單素數篩選法求N以內的素數。
輸入
N
輸出
2~N的素數
樣例輸入復制
100樣例輸出復制
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97代碼:
#include<iostream> #include<cmath> using namespace std; bool Is_sushu(int n) {for (int i = 2; i <= floor(sqrt(n) + 0.5); i++){if (n % i == 0)return 0;}return n; } int main() {int n;cin >> n;for (int i =2; i <=n; i++){if (Is_sushu(i) != 0){cout << i <<endl;}}return 0; }運行結果:
1141 百錢百雞問題
題目描述
中國古代數學家張丘建在他的《算經》中提出了著名的“百錢買百雞問題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,問翁、母、雛各幾何?
輸入
無輸入
輸出
給出所有的解,每組解占一行
解的順序:按“字典序”排列,即公雞數少的在前;公雞數相同,母雞數少的在前
格式:
cock=%d,hen=%d,chicken=%d\n
樣例輸入復制
無樣例輸出復制
cock=0,hen=25,chicken=75 cock=4,hen=18,chicken=78 cock=8,hen=11,chicken=81 cock=12,hen=4,chicken=84題目分析:
這道題實際上考察for循環嵌套
代碼:
#include<iostream> using namespace std; int main() {for(int x=0;x<100;x++){for(int y=0;y<100;y++){int z=200-8*x-5*y; //兩個式子的和if(z>=0&&z<100&&x+y+z==100){cout<<"cock="<<x<<","<<"hen="<<y<<","<<"chicken="<<z<<endl;}}}return 0; }?運行結果:
1199 哥德巴赫曾猜測
題目描述
德國數學家哥德巴赫曾猜測:任何大于6的偶數都可以分解成兩個素數(素數對)的和。但有些偶數可以分解成多種素數對的和,如: 10=3+7,10=5+5,即10可以分解成兩種不同的素數對
輸入
輸入任意的>6的正偶數(<32767)
輸出
試求給出的偶數可以分解成多少種不同的素數對(注: A+B與B+A認為是相同素數對)
樣例輸入復制
1234樣例輸出復制
25題目分析:
在for循環里面判斷是否為素數即可。在主函數外再定義并實現一個判斷素數函數
代碼:
#include<iostream> #include<cmath> using namespace std;bool Issushu(int k) {for (int i = 2; i <= floor(sqrt(k) + 0.5); i++){if (k % i == 0){return 0;}}return 1; } int main() {int n;cin >> n;int ans = 0;for (int i = 2; i <= n / 2; i++){if (Issushu(i) == 1 && Issushu(n - i) == 1){++ans;}}cout << ans << endl;return 0; }運行結果:?
?
1259 送分題素數
題目描述
輸出100->200之間的素數的個數,以及所有的素數。
輸入
無
輸出
100->200之間的素數的個數,以及所有的素數。
樣例輸入復制
無樣例輸出復制
21 101 103 ... 197 199題目分析:
1.關于素數的判定,即把要判斷的數跟他的平方根進行相余
代碼:
#include<iostream> #include<cmath> using namespace std; bool Is_sushu(int n) {for (int i = 2; i <= floor(sqrt(n) + 0.5); i++){if (n % i == 0)return 0;}return n; } int main() {int count = 0;for (int i = 100; i <= 200; i++){if (Is_sushu(i) != 0){count++;}}cout << count << endl;for (int i = 100; i <= 200; i++){if (Is_sushu(i) != 0){cout << i << "\t";}}cout << endl;return 0; }運行結果:
遞歸
1004 母牛的故事
題目描述
有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請編程實現在第n年的時候,共有多少頭母牛?
輸入
輸入數據由多個測試實例組成,每個測試實例占一行,包括一個整數n(0<n<55),n的含義如題目中描述。
n=0表示輸入數據的結束,不做處理。
輸出
對于每個測試實例,輸出在第n年的時候母牛的數量。
每個輸出占一行。
樣例輸入復制
2 4 5 0樣例輸出復制
2 4 6題目分析:
遞歸題最重要要找到相互之間存在的關系,
我們先列出一個表格,把每一年對應的母牛數量寫出來。
| 第 n年: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| f[n] 頭牛: | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 |
先看第 4 年,對應有 4 頭母牛,4 = 3+1;
再看第 5 年,對應有 6 頭母牛,6 = 4+2;
最后看第 6 年,對應有 9 頭母牛,9 = 6+3;
沒錯,是有規律的,該年母牛的數量就是一年前的數量再加上三年前的數量,
用公式表示就是 f[n] = f[n-1] + f[n-3]
代碼:
#include<iostream> using namespace std; int main() {int n;int f[55] = { 0,1,2,3 };for (int i = 4; i < 55; i++)f[i] = f[i - 1] + f[i - 3];while (cin >> n && n != 0){cout << f[n] << endl;}return 0; }?運行結果:
1463 Sine之舞
題目描述
最近FJ為他的奶牛們開設了數學分析課,FJ知道若要學好這門課,必須有一個好的三角函數基本功。所以他準備和奶牛們做一個“Sine之舞”的游戲,寓教于樂,提高奶牛們的計算能力。
不妨設
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想讓奶牛們計算Sn的值,請你幫助FJ打印出Sn的完整表達式,以方便奶牛們做題。
?
輸入
僅有一個數:N<201。
輸出
請輸出相應的表達式Sn,以一個換行符結束。輸出中不得含有多余的空格或換行、回車符。
樣例輸入復制
3樣例輸出復制
((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1題目解析:
這道題的輸出看起來復雜,其實不過就是for循環和遞歸的不斷輸出而成
代碼:
//An = sin(1–sin(2 + sin(3–sin(4 + ...sin(n))...) // Sn = (...(A1 + n)A2 + n - 1)A3 + ... + 2)An + 1 //打印出Sn的完整表達式 // 樣例輸入 // 3 // 樣例輸出 // ((sin(1) + 3)sin(1 - sin(2)) + 2)sin(1 - sin(2 + sin(3))) + 1 //1.輸入樣例 //2.根據式子特點進行循環 #include<iostream> using namespace std; void An(int n) {for (int i = 1; i <= n; i++){cout << "sin(" << i;if (i == n) break;if (i % 2){cout << "-";}else{cout << "+";}}while (n--){cout << ")";} } int main() {int n;cin >> n;for (int i = 2; i <= n; i++){cout << "(";}for (int i = 1; i <= n; i++){An(i);cout << "+" << n - i + 1;if (n - i + 1 != 1){cout << ")";}elsebreak;}return 0; }?運行結果:
1508 和最大子序列
題目描述
對于一個給定的長度為N的整數序列A,它的“子序列”的定義是:A中非空的一段連續的元素(整數)。你要完成的任務是,在所有可能的子序列中,找到一個子序列,該子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你輸出這個最大值。
輸入
輸入文件的第一行包含一個整數N,第二行包含N個整數,表示A。?
其中?
1? < =? N? < =? 100000?
-10000? < =? A[i]? < = 10000?
輸出
輸出僅包含一個整數,表示你算出的答案。?
樣例輸入復制
5 3 -2 3 -5 4樣例輸出復制
4代碼:
#include<iostream> using namespace std; int main() {int n,ch,sum=0,max=-10086;cin >> n;int* a = new int[n];for (int i = 0; i < n; i++){cin >> ch;a[i] = ch;sum += a[i];if (max < sum){max = sum;}if (sum < 0) //對于當前這個數,加入總和后若一旦使sum為負,立即置0處理,也就是從下一個數開始重新對sum計數求和,這樣就在保留了sum為負之前的最大max的同時又可以不影響接下來可能超過前面max的max數值所可能的交換。{sum = 0;}}cout << max << endl;return 0; }?運行結果:
1575 遞歸倒置字符數組
題目描述
完成一個遞歸程序,倒置字符數組。并打印實現過程
遞歸邏輯為:
當字符長度等于1時,直接返回
否則,調換首尾兩個字符,在遞歸地倒置字符數組的剩下部分
輸入
字符數組長度及該數組?
輸出
在求解過程中,打印字符數組的變化情況。?
最后空一行,在程序結尾處打印倒置后該數組的各個元素。?
樣例輸入復制
5 abcde樣例輸出復制
ebcda edcbaedcba代碼:
#include<iostream> #include<string> using namespace std; int n; string str; void BEswap(int l, int r) {if (l == r || l > (r - 1) / 2) return;std::swap(str[l], str[r]);cout << str << endl;BEswap(l + 1, r - 1); } int main() {cin >> n >> str;BEswap(0, n - 1);cout << endl << str << endl;return 0; }?運行結果:
1544 特殊的質數肋骨
題目描述
農民約翰母??偸钱a生最好的肋骨。你能通過農民約翰和美國農業部標記在每根肋骨上的數字認出它們。農民約翰確定他賣給買方的是真正的質數肋骨,是因為從右邊開始切下肋骨,每次還剩下的肋骨上的數字都組成一個質數。
例如有四根肋骨的數字分別是:7? 3? 3? 1,那么全部肋骨上的數字? 7331是質數;三根肋骨? 733是質數;二根肋骨? 73? 是質數;當然,最后一根肋骨? 7? 也是質數。7331? 被叫做長度? 4? 的特殊質數。
寫一個程序對給定的肋骨的數目? N? (1< =N< =8),求出所有的特殊質數。數字1不被看作一個質數。
輸入
單獨的一行包含N。?(1< =N< =8)
輸出
按順序輸出長度為? N? 的特殊質數,每行一個。?
樣例輸入復制
4樣例輸出復制
2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393代碼:
#include<iostream> #include<cmath> using namespace std; bool Issushu(int n) {for (int i = 2; i <= floor(sqrt(n) + 0.5); i++){if (n % i == 0){return false;}}return true; } int main() {int n;cin >> n;int max = pow(10, n) - 1;int min = 2*pow(10, n - 1);for (int i = min; i <= max; i++){int k = n;while (k > 0){if (Issushu(i / pow(10, k - 1))) k--;elsebreak;}if (k == 0)cout << i << endl;elsei = i - 1 + pow(10, k - 1);}return 0; }?運行結果:
動態規劃
1557 聰明的旅行家
題目描述
如果有人認為吃東西只需要嘴巴,那就錯了。
都知道舌頭有這么一個特性,“由簡入奢易,由奢如簡難”(據好事者考究,此規律也適合許多其他情況)。具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。
大寶是一個聰明的美食家,當然深諳此道。一次他來到某小吃一條街,準備從街的一頭吃到另一頭。為了吃得爽,他大費周章,得到了各種食物的“美味度”。他拒絕不爽的經歷,不走回頭路而且還要爽歪歪(爽的次數盡量多)。
輸入
兩行數據。?
第一行為一個整數n,表示小吃街上小吃的數量?
第二行為n個整數,分別表示n種食物的“美味度”?
數據規模和約定
美味度為0到100的整數
n< 1000
輸出
一個整數,表示吃得爽的次數?
樣例輸入復制
10 3 18 7 14 10 12 23 41 16 24樣例輸出復制
6答案鏈接:WU-藍橋杯算法提高VIP-聰明的美食家 (C++代碼)-Dotcpp編程社區
解析:?
1.要使爽的次數足夠多,則根據美味度從小到大進行品嘗
2.定義一個專門存放次數的數組,采用兩個數組指針,i指針比j指針走快一步,如果前后之間形成遞增關系,則次數加1
3.如果沒有遞增,則次數不變
--------------------------------------------------------------------------
數組由小到大進行排序:
#include<algorithm>
.....
sort(數組名,數組名+個數);
代碼:
#include <iostream> #include <algorithm> using namespace std; int main() { int n; cin >> n; int *a = new int [n]; int *b = new int [n]; //開辟兩個動態數組for(int i = 0; i < n; i++) {cin >> a[i]; b[i]=1;//b[i]表示前i+1個數中的最大不下降子序列的長度 初始值為1 }for(int i = 0; i < n; i++) { for(int j = 0; j < i; j++) { if(a[i] >=a[j]) //如果a[i]大于等于a[j],那么最大不下降子序列的長度就會+1b[i] = max(b[i], b[j]+1); //我們取較大的那個} } sort(b,b+n);//對數組進行排序cout<<b[n-1]<<endl;//輸出最大值return 0;運行結果:
1610 傳球游戲(錯誤8)
題目描述
上體育課的時候,小蠻的老師經常帶著同學們一起做游戲。這次,老師帶著同學們一起做傳球游戲。
游戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手里拿著一個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的一個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同學就是敗者,要給大家表演一個節目。
聰明的小蠻提出一個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手里開始傳的球,傳了m次以后,又回到小蠻手里。兩種傳球的方法被視作不同的方? 法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有3個同學1號、2號、3號,并假設小蠻為1號,球傳了3次回到小蠻手里的方? 式有1-> 2-> 3-> 1和1-> 3-> 2-> 1,共2種。
?
輸入
共一行,有兩個用空格隔開的整數n,m(3< =n< =30,1< =m< =30)。?
數據規模和約定
100%的數據滿足:3< =n< =30,1< =m< =30
?
輸出
t共一行,有一個整數,表示符合題意的方法數。?
樣例輸入復制
3 3樣例輸出復制
2答案原出處:藍橋杯算法訓練VIP-傳球游戲-題解(C++代碼)(含思路)-Dotcpp編程社區
解析:
假設有3個人,將每個人每次的獲球情況組成一個數組,求出的數組的答案就是不同的傳遞情況
動態規劃思路
先通過最簡單的情況推出規律
eg:n=3,m=3,開辟一個數組dp[i][j],i為傳球次數,j為人數,dp[i][j]表示的是第i的次傳球傳到j的個人手中的可能性
最初還未開始傳球,球在1的個人手中,且傳0次球,故dp = (1,0,0)
然后開始傳球,由于最初球在1手中,故,1只能將球傳出去,自己必然得不到球,而他也只能向左或右傳球,故此時第一個人得到球的可能性為0種,第二第三個人的可能性為1種,dp = (0,1,1)
進行第二次傳球:此時球在第二個人或第三個人手中,先討論第二個人,它只能將球傳給第一個人或第三個人,再討論三的個人傳球,它可以傳球給第一個和第二個人,故第一個人有兩種得球可能性,第二第三個人各一種,dp = (2, 1,1)
將dp數組列出找規律
1,0,0
0,1,1
2,1,1
發現下一行的元素等于上一行對應列的左邊和右邊的元素的和
故就推出了規律
dp[i][j] = dp[i-1][j-1]+dp[i-1][j+1]
但還要考慮在兩邊的情況,需單獨列出,到此思路就搞定了
代碼:
#include<iostream> using namespace std; int a[40][40]; int main() {int m, n;cin >> m >> n;a[0][0] = 1;for (int i = 1; i <= m; ++i){for (int j = 0; j < n; ++j){if (j == 0){a[i][0] = a[i - 1][n-2] + a[i - 1][n - 1];}else if (j == n - 1){a[i][n - 1] = a[i - 1][0] + a[i - 1][n - 2];}else{a[i][j] = a[i - 1][j - 1] + a[i - 1][j + 1];}}}cout << a[m][0];return 0; }?運行結果:
1633 數的統計
題目描述
在一個有限的正整數序列中,有些數會多次重復出現在這個序列中。
如序列:3,1,2,1,5,1,2。其中1就出現3次,2出現2次,3出現1? 次,5出現1次。
你的任務是對于給定的正整數序列,從小到大依次輸出序列中出現的數及出現的次數。
?
輸入
第一行正整數n,表示給定序列中正整數的個數。?
第二行是n? 個用空格隔開的正整數x,代表給定的序列。
數據規模和約定
數據:n< =1000;0< x< =1000,000。
輸出
若干行,每行兩個用一個空格隔開的數,第一個是數列中出現的數,第二個是該數在序列中出現的次數。?
樣例輸入復制
12 8 2 8 2 2 11 1 1 8 1 13 13樣例輸出復制
1 3 2 3 8 3 11 1 13 2解析:
1.sort排序
2.定義k來表示數組相等的數,sum計數
代碼:
#include<iostream> #include<algorithm> using namespace std; int main() {int n,ch;cin >> n;int* a = new int[n];for (int i = 0; i < n; i++){cin >> ch;a[i] = ch;}sort(a, a + n);int k = 0;while (k < n){int sum = 1;while (a[k] == a[k + 1]){++sum;k++;}cout << a[k] << "\t" << sum << endl;k++;}return 0; }?運行結果:
進制
?做到進制,我看的這篇博客真的很棒,其它的做法或多或少有點彎彎繞繞,但這篇單刀直入:(64條消息) C++中八進制、十進制和十六進制之間的相互轉換_福小簡的博客-CSDN博客
這篇博客是關于二進制函數bitset的相關使用,用這篇內容的方法解決問題特別簡單:(64條消息) c++ bitset類用法_Liam Q的專欄-CSDN博客
1572 進制轉換(答案錯誤27)
題目描述
程序提示用戶輸入三個字符,每個字符取值范圍是0-9,A-F。然后程序會把這三個字符轉化為相應的十六進制整數,并分別以十六進制,十進制,八進制輸出。
輸入
輸入只有一行,即三個字符。?
輸出
三個整數,中間用空格隔開。
樣例輸入復制
FFF樣例輸出復制
FFF 4095 7777代碼:
#include<iostream> using namespace std; int main() {int n;cin >> hex >> n;cout << hex << n << "\t";cout << dec << n << "\t";cout << oct << n << endl;return 0; }?運行結果:
1934 十進制數轉八進制數
題目描述
編寫函數,其功能為把一個十進制數轉換為其對應的八進制數。程序讀入一個十進制數,調用該函數實現數制轉換后,輸出對應的八進制數。輸入
9274輸出
22072樣例輸入復制
18樣例輸出復制
22代碼:
#include<iostream> using namespace std; int main() {int n;cin>>n;cout<<oct<<n<<endl;return 0; }運行結果:?
?
2619 二進制問題(時間超限27)
題目描述
小藍最近在學習二進制。他想知道 1 到 N 中有多少個數滿足其二進制表示中恰好有 K 個 1。你能幫助他嗎?
輸入
輸入一行包含兩個整數 N 和 K。
輸出
輸出一個整數表示答案。
樣例輸入復制
7 2樣例輸出復制
3?解析:
1.將每個遍歷到的數字轉換為二進制? bitset<4>a(i);
2.應用二進制a.size()函數求出1的個數,累加
3.輸出累加后的count
(58條消息) c++ bitset類用法_Liam Q的專欄-CSDN博客
代碼:
#include<iostream> #include<bitset> using namespace std; int main() {int N, K, n, count = 0;cin >> N >> K;for (int i = 1; i <= N; ++i){bitset<4>a(i);if (a.count() == K){++count;}}cout << count << endl;return 0; }運行結果:
2080 十六進制轉八進制
題目描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入復制
2 39 123ABC樣例輸出復制
71 4435274代碼:
#include<iostream> #include<string> using namespace std; int main() {int n,ch;cin>>n;for(int i=0;i<n;i++){cin>>hex>>ch;cout<<oct<<ch<<endl;}return 0; }?運行結果:
2082 十六進制轉十進制?
題目描述
從鍵盤輸入一個不超過8位的正的十六進制數字符串,將它轉換為正的十進制數后輸出。
注:十六進制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。
輸入
一個十六進制數
輸出
對應得十進制
樣例輸入復制
FFFF樣例輸出復制
65535代碼:
#include<iostream> using namespace std; int main() {int str;cin>>hex>>str;cout<<dec<<str<<endl;return 0; }?運行結果:
2083 十進制轉十六進制?(答案錯誤45)
題目描述
十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進制數的0至15。十六進制的計數方法是滿16進1,所以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
給出一個非負整數,將它表示成十六進制的形式。
輸入
輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出
輸出這個整數的16進制表示
樣例輸入復制
30樣例輸出復制
1E代碼:
#include<iostream> using namespace std; int main() {int ch;cin >> ch;cout << hex << ch << endl;return 0; }?運行結果:
?2218 二進制數數(答案錯誤17)
題目描述
給定L,R。統計[L,R]區間內的所有數在二進制下包含的“1”的個數之和。
如5的二進制為101,包含2個“1”。
輸入
第一行包含2個數L,R
輸出
一個數S,表示[L,R]區間內的所有數在二進制下包含的“1”的個數之和。
樣例輸入復制
2 3樣例輸出復制
3代碼:
#include<iostream> #include<bitset> using namespace std; int main() {int L, R, sum = 0;cin >> L >> R;for (int i = L; i <= R; i++){bitset<4> a(i);sum += a.count();}cout << sum << endl;return 0; }?運行結果:
2248 輸出二進制表示?
題目描述
輸入[-128,127]內的整數,輸出其二進制表示。
輸入
一個滿足題目要求的輸入范例。
輸入數據中每一個數的范圍。
例:0<n,m<100, 0<=矩陣中的每個數<=1000。
輸出
與上面的樣例輸入對應的輸出。
樣例輸入復制
7樣例輸出復制
00000111代碼:
#include<iostream> #include<bitset> using namespace std; int main() {int ch;cin >> ch;if (ch>= -128 || ch<=127){cout << bitset<8>(ch);}return 0; }?運行結果:
模擬
1429 蘭頓螞蟻(答案錯誤25)
題目描述
蘭頓螞蟻,是于1986年,由克里斯·蘭頓提出來的,屬于細胞自動機的一種。
平面上的正方形格子被填上黑色或白色。在其中一格正方形內有一只“螞蟻”。
螞蟻的頭部朝向為:上下左右其中一方。
螞蟻的移動規則十分簡單:
若螞蟻在黑格,右轉90度,將該格改為白格,并向前移一格;
若螞蟻在白格,左轉90度,將該格改為黑格,并向前移一格。
規則雖然簡單,螞蟻的行為卻十分復雜。剛剛開始時留下的路線都會有接近對稱,像是會重復,但不論起始狀態如何,螞蟻經過漫長的混亂活動后,會開辟出一條規則的“高速公路”。
螞蟻的路線是很難事先預測的。
你的任務是根據初始狀態,用計算機模擬蘭頓螞蟻在第n步行走后所處的位置。
輸入
輸入數據的第一行是? m? n? 兩個整數(3? < ? m,? n? < ? 100),表示正方形格子的行數和列數。?
接下來是? m? 行數據。?
每行數據為? n? 個被空格分開的數字。0? 表示白格,1? 表示黑格。?
接下來是一行數據:x? y? s? k,? 其中x? y為整數,表示螞蟻所在行號和列號(行號從上到下增長,列號從左到右增長,都是從0開始編號)。s? 是一個大寫字母,表示螞蟻頭的朝向,我們約定:上下左右分別用:UDLR表示。k? 表示螞蟻走的步數。?
輸出
輸出數據為一個空格分開的整數? p? q,? 分別表示螞蟻在k步后,所處格子的行號和列號。
樣例輸入復制
5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 L 5樣例輸出復制
1 3解析:
1.定義矩陣的行列,蜘蛛的位置,步數以及方向
2.定義一個二維數組
3.深度遍歷
? ①當前步數=規定步數,輸出蜘蛛此刻的位置
? ②當前位置在白格
? ③當前位置在黑格
4.設定行列數,當前位置,要走的步數,方向等
5.實現深度遍歷函數?
代碼:
#include<iostream> using namespace std; int m, n, x, y, k; char s; int map[1000][1000]; void Dfs(int x, int y, int cnt, char s) {if (cnt == k){cout << x-1 << "\t" << y << endl;return;}else if (map[m][n] == 1){map[m][n] = 0;if (s == 'L'){Dfs(x - 1, y, cnt + 1, 'U');}else if (s == 'R'){Dfs(x + 1, y, cnt + 1, 'D');}else if (s == 'U'){Dfs(x, y + 1, cnt + 1, 'R');}else if (s == 'D'){Dfs(x, y - 1, cnt + 1, 'L');}}else if (map[m][n] == 0){map[m][n] = 1;if (s == 'L'){Dfs(x + 1, y, cnt + 1, 'D');}else if (s == 'R'){Dfs(x - 1, y, cnt + 1, 'U');}else if (s == 'U'){Dfs(x, y - 1, cnt + 1, 'L');}else if (s == 'D'){Dfs(x, y + 1, cnt + 1, 'R');}} } int main() {cin >> m >> n;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){cin >> map[i][j];}}cin >> x >> y >> s >> k;Dfs(x, y, k, s);return 0; }運行結果:
1480 模擬計算器(答案錯誤82)
題目描述
使用Switch語句編寫一個模擬簡單計算器的程序。依次輸入兩個整數和一個字符,并用空格隔開。如果該字? 符是一個“+”,則打印和;如果該字符是一個“-”,則打印差;如果該字符是一個“*”,則打印積;如果該字符是“/”,則打印商;如果該字符是一個? “%”,則打印余數。打印結果后輸出一個空行。
?
輸入
無
輸出
無
樣例輸入復制
3 4 +樣例輸出復制
7代碼:
#include<iostream> using namespace std;int main() {char ch;int a, b, c;cin >> a >> b >> ch;switch (ch){case '+':c = a + b;break;case '-':c = a - b;break;case '*':c = a * b;break;case '/':c = a / b;break;}cout << c;cout << endl;return 0; }?運行結果:
1481 剪刀石頭布(答案錯誤80)?
題目描述
編寫程序實現“剪刀,石頭,布”游戲。在這個游戲中,兩個人同時說“剪刀”,“石頭”或“布”,壓過另一方的為勝者。規則是:“布”勝過“石頭”,“石頭”勝過“剪刀”,“剪刀”勝過“布”。要求:選擇結構中使用枚舉類型,結果的輸出也使用枚舉類型表示。
輸入
兩個數,范圍為{0,1,2},用空格隔開。0表示石頭,1表示布,2表示剪刀。這兩個數分別表示兩個人所說的物品。
輸出
如果前者贏,輸出1。如果后者贏,輸出-1。如果是平局,輸出0。?
樣例輸入復制
0 2樣例輸出復制
1代碼:
#include<iostream> using namespace std; int main() {int a, b; //0---石頭 1---布 2---剪刀cin >> a >> b;if (a == 0 && b == 1){cout << "-1";}else if (a == 0 && b == 2){cout << "1";}else if (a == 1 && b == 0){cout << "1";}else if (a == 1 && b == 2){cout << "-1";}elsecout << "0"; }?運行結果:
?
總結
以上是生活随笔為你收集整理的蓝桥杯练习系统[C++]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惠普暗影精灵6 Air怎么样
- 下一篇: 微信小程序:炫酷手持滚动弹幕生成小工具