片頭
嗨~小伙伴們,咱們繼續攻克填空題,先把5分拿到手~
第1題? 數位遞增的數
這道題,需要我們計算在整數 1 至?n?中有多少個數位遞增的數。
什么是數位遞增的數呢?一個正整數如果任何一個數位不大于右邊相鄰的數位。比如:1234是一個數位遞增的數;4321則不是。
解題思路:我們可以把1~n個數全部轉化為字符串類型。用另外一個字符串類型的變量s來保存。再對當前這個字符串進行排序(排升序)。如果二者相同,那么該數是數位遞增的數。
#include <bits/stdc++.h> // 包含所有標準庫頭文件
using namespace std; // 使用標準命名空間
int main()
{int n;cin >> n; // 從標準輸入讀取一個整數nint ans = 0; // 初始化計數器ans為0,用于統計符合條件的數字個數for(int i = 1; i <= n; i++) // 遍歷從1到n的每個數字{string s = to_string(i); // 將當前數字i轉換為字符串形式string s1 = s; // 創建字符串s的副本s1sort(s1.begin(), s1.end()); // 對s1中的字符按升序排序if(s == s1) ans++; // 如果原字符串s與排序后的s1相同,說明數字是升序排列的}cout << ans << endl; // 輸出符合條件的數字個數return 0;
}
第2題? 數位和
這道題目很簡單,將1~1000所有數字的數位和算出來,累加到變量SUM中,就可以了。
#include <iostream>
using namespace std;//求數位和
int get_sum(int x){int temp = x;int sum = 0;while(temp != 0){int r = temp % 10;sum += r;temp /= 10;}return sum;
}int main()
{int SUM = 0;for(int i = 1; i<= 1000; i++){SUM += get_sum(i);}cout << SUM << endl;return 0;
}
第3題? 數位比較
這道題,是給定我們區間范圍,計算滿足數字的數位上的?0 的個數要大于數位上的?1?的個數。
#include <iostream>
using namespace std;int Func(int x)
{int temp = x; // 創建臨時變量保存x的值int num1 = 0, num2 = 0; // num1統計0的個數,num2統計1的個數while(temp != 0) { // 循環處理每一位數字if(temp % 10 == 0) num1++; // 如果當前位是0,num1加1if(temp % 10 == 1) num2++; // 如果當前位是1,num2加1temp /= 10; // 去掉已處理的最低位}if(num1 > num2) return 1; // 如果0比1多,返回1else return 0; // 否則返回0
}int main()
{int L, R; // 定義區間端點變量cin >> L >> R; // 輸入區間范圍[L, R]int ans = 0; // 初始化計數器for(int i = L; i <= R; i++) { // 遍歷區間內每個數字if(Func(i) == 1) ans++; // 如果滿足條件,計數器加1}cout << ans << endl; // 輸出結果return 0;
}
第4題? 最小數位和
這道題,雖然數據量比較大,但是我們不要被題目唬住了。
解題思路:①可以定義8行8列的二維數組存儲64個數據。
int a[8][8] = {{454771,329157,801601,580793,755604,931703,529875,361797},{604358,529564,574776,821517,195563,688516,223321,607845},{284772,603562,543328,707484,533688,380468,233733,257995},{896582,670074,912386,702393,722092,834842,126346,606526},{376981,910643,413754,945725,817853,651778,350775,676550},{316935,487808,939526,900568,423326,298936,927671,539773},{136326,717022,886675,466684,436470,558644,267231,902422},{743580,857864,529622,320921,595409,486860,951114,558787}};
?②題目問我們數位和最小的數,咱們先實現一個求數位和的函數。
//求數位和
int get_sum(int a) {int sum = 0;int temp = a;while (temp != 0) {int r = temp % 10;sum += r;temp /= 10;}return sum;
}
接著我們可以在main函數中調用get_sum函數。
定義變量min,初始值為INT_MAX(需要引用頭文件 <climits>,但是 <bits/stdc++.h>?已經包含了)。
從第1行第1列,也就是從第1個元素(a[0][0])開始遍歷,依次計算每個數的數位和,保存到變量d中。如果當前的數位和d<min,那么將d賦給min (min = d),同時用另一個變量num保存當前的數。
int min = INT_MAX; // 初始化最小和為最大整數值int num = 0; // 存儲數字和最小的那個數int d = 0; // 臨時存儲數字和// 遍歷二維數組for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {d = get_sum(a[i][j]); // 計算當前數的數字和if (d < min) { // 如果比當前最小值小min = d; // 更新最小值num = a[i][j]; // 更新對應的數}}}
最后輸出數位和最小的數
cout << num << endl; // 輸出結果
ok,本道題的完整代碼如下:
#include <bits/stdc++.h>
using namespace std;//求數位和
int get_sum(int a){int sum = 0;int temp = a;while(temp != 0){int r = temp % 10;sum += r;temp /= 10;}return sum;
}int main()
{int a[8][8] = {{454771,329157,801601,580793,755604,931703,529875,361797},{604358,529564,574776,821517,195563,688516,223321,607845},{284772,603562,543328,707484,533688,380468,233733,257995},{896582,670074,912386,702393,722092,834842,126346,606526},{376981,910643,413754,945725,817853,651778,350775,676550},{316935,487808,939526,900568,423326,298936,927671,539773},{136326,717022,886675,466684,436470,558644,267231,902422},{743580,857864,529622,320921,595409,486860,951114,558787}};int min = INT_MAX; // 初始化最小和為最大整數值int num = 0; // 存儲數字和最小的那個數int d = 0; // 臨時存儲數字和// 遍歷二維數組for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {d = get_sum(a[i][j]); // 計算當前數的數字和if (d < min) { // 如果比當前最小值小min = d; // 更新最小值num = a[i][j]; // 更新對應的數}}}cout << num << endl; // 輸出結果return 0;
}
第5題? 數位和相等
題目讓我們求第23個數位和相等的正整數,數位和相等:一個正整數轉化成二進制與轉換成八進制后所有數位的數字之和相等。
定義變量count(計數器),表示滿足條件的第幾個數;定義變量i,初始值為1,從1開始檢查數字。
沒有給定循環范圍,因此我們采用while循環。因為求第23個數位和相等的數,如果count從0開始,那么到22結束;如果count從1開始,那么到23結束。
int i = 1; // 從1開始檢查數字int count = 0; // 計數器,記錄滿足條件的數字個數while(count < 23) //count的取值范圍: 0~22,總共23個數{if(S(i)) count++; // 如果i滿足條件,計數器加1i++; // 檢查下一個數字}
當count==23時,退出while循環。但是此時 i 已經自增,因此需要輸出 i-1。
// 注意:此時i已經自增過了,所以要輸出i-1cout << i-1 << endl;
接下來我們需要實現S函數,判斷1個數的二進制和八進制的數位和是否相同。
int S(int N) {if (N <= 0) return 0; // 處理非正整數int sum2 = 0, sum8 = 0; // sum2存儲二進制和,sum8存儲八進制和int temp = N; // 臨時變量保存N的值//計算二進制各位和while (temp != 0){int r = temp % 2; // 取二進制最后一位sum2 += r; // 累加到sum2temp /= 2; // 去掉已處理的最后一位}temp = N; // 重置temp為原始值//計算八進制各位和while (temp != 0){int ge = temp % 8; // 取八進制最后一位sum8 += ge;temp /= 8;}if (sum2 == sum8) return 1; // 和相等返回1else return 0; // 不等返回0
}
歐克啦,本題的完整代碼如下:
#include <iostream>
using namespace std;int S(int N) {if (N <= 0) return 0; // 處理非正整數int sum2 = 0, sum8 = 0; // sum2存儲二進制和,sum8存儲八進制和int temp = N; // 臨時變量保存N的值//計算二進制各位和while (temp != 0){int r = temp % 2; // 取二進制最后一位sum2 += r; // 累加到sum2temp /= 2; // 去掉已處理的最后一位}temp = N; // 重置temp為原始值//計算八進制各位和while (temp != 0){int ge = temp % 8; // 取八進制最后一位sum8 += ge;temp /= 8;}if (sum2 == sum8) return 1; // 和相等返回1else return 0; // 不等返回0
}int main()
{int i = 1; // 從1開始檢查數字int count = 0; // 計數器,記錄滿足條件的數字個數while (count < 23) //count的取值范圍: 0~22,總共23個數{if (S(i)) count++; // 如果i滿足條件,計數器加1i++; // 檢查下一個數字}// 注意:此時i已經自增過了,所以要輸出i-1cout << i - 1 << endl;return 0;
}
第6題???數位計數
這道題,很簡單。統計1個數一共有多少個數位。n的范圍比較大,因此我們可以用 long long 來定義。
#include <iostream>
using namespace std;
typedef long long ll;ll get_count(ll x){ll temp = x;ll count = 0;while(temp != 0){temp = temp / 10;count++; //統計數位個數}return count;
}int main()
{ll n;cin >> n;ll ret = get_count(n);cout << ret << endl;return 0;
}
第7題? 數位和
首先,題目給定范圍:①質數,因此我們需要實現判斷是否為質數的函數;?②計算質數的各個數位之和,判斷是否等于23。我們需要實現計算數位和的函數。
判斷是否為質數的代碼如下:
//判斷是否為質數
bool is_prime(int x)
{//這里必須是 i < sqrt(x), 不然編譯報錯for(int i = 2; i < sqrt(x) ; i++){if(x % i == 0) return 0; //不是質數,返回0}return 1;//只能被 1 和本身整除,是質數,返回1
}
需要額外注意:質數判斷應從2開始,且只需檢查到即可
計算數位和的函數如下:
//計算數位和
int get_sum(int x)
{int temp = x;int sum = 0;while (temp != 0){int r = temp % 10;sum += r;temp /= 10;}return sum;
}
最后在main函數里面調用這2個函數即可。
//計數器,統計滿足條件的數的個數int cnt = 0;for(int i = 3; i <= 1000000; i++){//如果該數為質數并且數位之和為23,計數器+1if(is_prime(i) && get_sum(i) == 23) cnt++; }cout << cnt <<endl; //輸出結果
歐克啦,本題完整代碼如下:
#include <bits/stdc++.h>
using namespace std;//判斷是否為質數
bool is_prime(int x)
{//這里必須是 i < sqrt(x), 不然編譯報錯for(int i = 2; i < sqrt(x) ; i++){if(x % i == 0) return 0;}return 1;
}//計算數位和
int get_sum(int x)
{int temp = x;int sum = 0;while(temp != 0){int r = temp % 10;sum += r;temp /= 10;}return sum;
}int main()
{//計數器,統計滿足條件的數的個數int cnt = 0;for(int i = 3; i <= 1000000; i++){//如果該數為質數并且數位之和為23,計數器+1if(is_prime(i) && get_sum(i) == 23) cnt++; }cout << cnt <<endl; //輸出結果return 0;
}
第8題? 倍數
這道題很簡單,代碼如下:
#include <iostream>
using namespace std;
int main()
{int cnt = 0;for(int i = 1; i <= 2020; i++){if(i % 4 == 0 && i % 6 == 0) cnt++;}cout << cnt << endl;return 0;
}
第9題? 約數
代碼如下:
#include <iostream>
using namespace std;
int main()
{int cnt = 0;for (int i = 1; i <= 2020; i++) {if (2020 % i == 0) cnt++;}cout << cnt << endl;return 0;
}
?第10題? 公約數
代碼如下:
#include <iostream>
using namespace std;
int main()
{int cnt = 0;for (int i = 1; i <= 2020; i++) {if (2020 % i == 0 && 3030 % i == 0) cnt++;}cout << cnt << endl;return 0;
}
?第11題??約數個數
代碼如下:
#include <iostream>
using namespace std;int main()
{int n = 1200000;int ans = 0;for (int i = 1; i <= n; i++) {if (n % i == 0) ans++;}cout << ans;return 0;
}
片尾
今天我們鞏固了填空題基礎,希望看完這篇文章對友友們有所幫助!!!
求點贊收藏加關注!!!
謝謝大家!!!