目錄
藍橋杯2024年第十五屆省賽真題-好數? 【模擬題】
題目描述
輸入格式
輸出格式
樣例輸入
樣例輸出
提示
代碼1:有兩個案例過不了,超時
藍橋杯2024年第十五屆省賽真題-R 格式 【vector容器的使用】
題目描述
輸入格式
輸出格式
樣例輸入
樣例輸出
提示
代碼:看博主題解寫的,不知道為什么輸不出結果
參考代碼:
藍橋杯2024年第十五屆省賽真題-好數? 【模擬題】
題目描述
一個整數如果按從低位到高位的順序,奇數位(個位、百位、萬位 · · · )上的數字是奇數,偶數位(十位、千位、十萬位 · · · )上的數字是偶數,我們就稱之為“好數”。給定一個正整數 N,請計算從 1 到 N 一共有多少個好數。
輸入格式
一個整數 N。
輸出格式
一個整數代表答案。
樣例輸入
24
樣例輸出
7
提示
對于第一個樣例,24 以內的好數有 1、3、5、7、9、21、23,一共 7 個。試題 C: 好數 4第十五屆藍橋杯大賽軟件賽省賽 C/C++ 大學 B 組【評測用例規模與約定】對于 10% 的評測用例,1 ≤ N ≤ 100。對于 100% 的評測用例,1 ≤ N ≤ 107。
代碼1:有兩個案例過不了,超時
#include<bits/stdc++.h>using namespace std;int n;
int ans;bool check(string s)
{for(int i=s.size()-1,j=1;i>=0;i--,j++){if((j%2!=0&&s[i]%2==0)||(j%2==0&&s[i]%2!=0)) return false;}return true;
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++){string s=to_string(i);if(check(s))ans++;}cout<<ans<<endl;return 0;}
藍橋杯2024年第十五屆省賽真題-R 格式 【vector容器的使用】
題目描述
小藍最近在研究一種浮點數的表示方法:R 格式。對于一個大于 0 的浮點數 d,可以用 R 格式的整數來表示。給定一個轉換參數 n,將浮點數轉換為 R格式整數的做法是:
1. 將浮點數乘以 2n;
2. 四舍五入到最接近的整數。
輸入格式
一行輸入一個整數 n 和一個浮點數 d,分別表示轉換參數,和待轉換的浮點數。
輸出格式
輸出一行表示答案:d 用 R 格式表示出來的值。
樣例輸入
2 3.14
樣例輸出
13
提示
【樣例說明】
3.14 × 22?= 12.56,四舍五入后為 13。
【評測用例規模與約定】
對于 50% 的評測用例:1 ≤ n ≤ 10,1 ≤ 將 d 視為字符串時的長度 ≤ 15。
對于 100% 的評測用例:1 ≤ n ≤ 1000,1 ≤ 將 d 視為字符串時的長度≤ 1024;保證 d 是小數,即包含小數點。
易錯點:由于有小數點的存在,只能將浮點數以字符串的形式輸入
代碼:看博主題解寫的,不知道為什么輸不出結果
#include<bits/stdc++.h>
//#define int long long
using namespace std;int n;
string s;void multi(string s,int n)
{int dotpos=s.find('.');//小數點的位置,為了刪去小數點 int del=s.size()-dotpos-1;//小數部分的長度,為了后面能通過小數點的個數重新計算小數點位置 s.erase(dotpos,1);//移除小數點,為后面的乘法計算做準備vector<int> digits;for(auto c:s)//將字符串轉換為整型數組 {digits.push_back(c-'0');}//以for(int i=0;i<n;i++){int carry=0;//進位值for(int j=digits.size()-1;j>=0;j++)//每一位都要乘2 {int tmp=digits[j]*2+carry;//當前位的計算加上低位的進位值 digits[j]=tmp%10;//當前位的計算值 carry=tmp/10;//向高位的進位值,當前位大于10時進1 }if(carry>0)digits.insert(digits.begin(),carry);//如果當前還有進位值,就是新的最高位 } //計算新的小數點的位置:根據乘法規則可知乘法不改變原來的小數點數//由于在前面的乘法運算中可能會改變整數的位數,所以要重新計算小數點的位置//這里計算小數點的位置是為了后面的四舍五入int newDotp=digits.size()-(del);//如果新的小數點數位置小于等于0,則需要在前面添0//結果是10^-k次方,插入前導0,如123 -->0.00123if(newDotp<=0){digits.insert(digits.begin(),-newDotp+1,0); newDotp=1; }//四舍五入//注意判斷新小數點的位置,防止越界 if(newDotp<digits.size()) {//此時的數組中是不存在小數點的//而且此時小數點的位置一定是小數點后第一位的數字 if(digits[newDotp]>=5){//從小數點前第一個數開始向左進位 int i=newDotp-1;//小數點前的第一個數while(i>=0){if(digits[i]<9){digits[i]++;break; }else{digits[i]=0;i--;}}//注意特判,即當所有數都是9,就會一直前進導致i<0//則需要在最前面加1if(i<0){digits.insert(digits.begin(),1);newDotp++;//小數點位置同步更新//因為在前面加1相當于把所有的數字都想后移1位,此時記錄的小數點位置也要后移//用于后面將小數點后的數刪去 } }}//舍棄小數部分if(newDotp<digits.size())digits.resize(newDotp); for(auto c:digits){ cout<<c;} cout<<endl;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;cin>>s;multi(s,n);return 0;
}