算法练习题
1、四舍五入-进位问题
B-渴殍:沙漠千里行_2025年香港城市大学(东莞)新生程序设计个人排位赛正式赛(同步赛)
思路:
1、首先,遍历字符串,找到小数点的位置;
2、判断小数点后面一位是否大于等于5;
3、小于5时,无进位,把小数点前面部分输出即可;
4、大于等于5时,有进位,这时需要考虑小数点前的数是否为9,以及更前面的数是否为9,因为这涉及到多个数的进位;
5、若前面全为9,则输出1,后面接多个0,0的个数为小数点前面数字的位数;
6、若有不为9的数,找到不为9的数的位置,这个数前面部分正常输出,当前数+1,后面部分为0。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
int main(){string s;cin>>s;ll index=-1;for(ll i=0;i<s.size();i++){if(s[i]=='.'){index=i;break;}}if(s[index+1]<'5'){for(ll i=0;i<=index-1;i++){cout<<s[i];}return 0;}ll k=-1;for(ll i=index-1;i>=0;i--){if(s[i]!='9'){k=i;break;}}if(k==-1){cout<<1;for(ll i=0;i<=index-1;i++){cout<<0;}}else{for(ll i=0;i<=k-1;i++){cout<<s[i];}cout<<s[k]-'0'+1;for(ll i=k+1;i<=index-1;i++){cout<<0;}}
}
2、数列问题
F-优香数列_2025年香港城市大学(东莞)新生程序设计个人排位赛正式赛(同步赛)
思路:根据递归公式,打表,可以得到规律。a[1]~a[n], 1个1, 2个2, 3个3,以此类推。
k为整数
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
void solve(){ll n;cin>>n;ll k;k=(-1+sqrt(1+8*n))/2;if(2*k<-1+sqrt(1+8*n)){k=k+1;}cout<<k<<endl;
}
int main(){ll t;cin>>t; while(t--){solve();}
}