蓝桥杯练习(五)

迈不过友情╰ 2023-07-18 14:26 107阅读 0赞

蓝桥杯练习(五)

      • 天数计算
      • 求和求平均值
      • 字符串长度
      • 第五次作业:字符串排序
      • 多阶乘计算
      • 数字游戏
      • 乘法次数
      • 参考博客

天数计算

问题描述
  编写函数求某年某月某日(**** ** **)是这一年的第几天 。提示:要考虑闰年,闰年的2月是29天(闰年的条件:是4的倍数但不是100的倍数,或者是400的倍数)。编写主函数,输入年月日,测试该函数并输出结果。
输入格式
  按“yyyy mm dd”的格式输入年月日

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. /** *@brief 判断year年是否为闰年 */
  4. bool isLeap(int year){
  5. return (year%4==0&&year%100!=0)||(year%400==0);
  6. }
  7. int main(){
  8. int y,m,d;
  9. int months[]={ 0,31,28,31,30,31,30,31,31,30,31,30,31};
  10. cin>>y>>m>>d;
  11. if(isLeap(y))months[2]++;
  12. int sum=0;
  13. for(int i=1;i<m;++i)sum+=months[i];
  14. cout<<sum+d;
  15. }

求和求平均值

问题描述
  从键盘输入10个浮点数,求出它们的和以及平均值,要求用函数实现
输入格式
  测试数据的输入一定会满足的格式。
  1 10 (1行10列的向量)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. /** *@brief 对数组求平均值 */
  4. template<class T>
  5. T mean(T a[],int n){
  6. T x=0;
  7. for(int i=0;i<n;++i)x+=a[i];
  8. return x/n;
  9. }
  10. /** * @brief 求数组的和 */
  11. template<class T>
  12. T sum(T a[],int n){
  13. T x = 0;
  14. for(int i=0;i<n;++i)x+=a[i];
  15. return x;
  16. }
  17. int main(){
  18. double x[10];
  19. for(int i=0;i<10;++i)cin>>x[i];
  20. cout<<sum(x,10)<<endl<<mean(x,10);
  21. }

字符串长度

问题描述
  输入一个字符串,输出其长度。
输入格式
  输入一个字符串

  1. #include <cstdio>
  2. using namespace std;
  3. /** * @brief 求字符串的长度 */
  4. int length(char c[]){
  5. int i =0;
  6. while(c[i])i++;
  7. return i;
  8. }
  9. int main(){
  10. char str[101];
  11. gets(str);
  12. printf("%d",length(str));
  13. }

第五次作业:字符串排序

问题描述
  输入一个小写字符串,按从小到大的顺序输出。

  1. #include <cstdio>
  2. using namespace std;
  3. /** * @brief 求字符串的长度 */
  4. int length(char c[]){
  5. int i =0;
  6. while(c[i])i++;
  7. return i;
  8. }
  9. /** * @brief 交换 */
  10. template<class T>
  11. void swap(T&a,T&b){
  12. T c = a;
  13. a = b;
  14. b = c;
  15. }
  16. /** * @brief 对字符串进行排序 */
  17. int sort(char c[]){
  18. int len = length(c);
  19. for(int i=0;i<len-1;++i){
  20. for(int j=0;j<len-i-1;++j){
  21. if(c[j]>c[j+1])swap(c[j],c[j+1]);
  22. }
  23. }
  24. }
  25. int main(){
  26. char str[1001];
  27. gets(str);
  28. sort(str);
  29. printf("%s",str);
  30. }

多阶乘计算

问题描述
  我们知道,阶乘n!表示n*(n-1)*(n-2)*…*\2*1, 类似的,可以定义多阶乘计算,例如:5!!=5*3*1,依次可以有n!..!(k个‘!’,可以简单表示为n(k)!)=n*(n-k)*(n-2k)*…(直到最后一个数<=0)。
  现给定一组数据n、k、m,当m=1时,计算并输出n(1)!+n(2)!+…+n(k)!的值,m=2时计算并输出n(1)!+n(2)!+…+n(k)!的各个位上的数字之和。
输入格式
  两行,第一行为n(n<=20)和k,第二行为m。

  1. #include <cstdio>
  2. using namespace std;
  3. typedef long long ll;
  4. int main(){
  5. int n,m,k;
  6. ll sum=0,d;
  7. scanf("%d%d%d",&n,&k,&m);
  8. for(int i=1;i<=k;++i){
  9. d = 1;
  10. for(int j=n;j>1;j-=i)d*=j;
  11. sum+=d;
  12. }
  13. if(m==1)printf("%lld",sum);
  14. else {
  15. d = 0;
  16. while(sum){
  17. d+=sum%10;
  18. sum/=10;
  19. }
  20. printf("%lld",d);
  21. }
  22. return 0;
  23. }

数字游戏

问题描述
  给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
  例如:
  3 1 2 4
  4 3 6
  7 9
  16
  现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
  第1行为两个正整数n,sum
数据规模和约定
  0<n<=10

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. /** * @brief 令a[i]+=a[i+1] */
  5. void perSum(int a[],int n){
  6. for(int i=0;i<n;++i)a[i]+=a[i+1];
  7. }
  8. int main(){
  9. int n,sum;
  10. scanf("%d%d",&n,&sum);
  11. int a[10],d[10];
  12. for(int i=0;i<n;++i)a[i]=i+1;
  13. do{
  14. for(int i=0;i<n;++i)d[i]=a[i];
  15. for(int i=n-1;i>0;--i)perSum(d,i);
  16. if(d[0]==sum){
  17. for(int i=0;i<n-1;++i)printf("%d ",a[i]);
  18. printf("%d\n",a[n-1]);
  19. break;
  20. }
  21. }while(next_permutation(a,a+n));
  22. return 0;
  23. }

乘法次数

问题描述
  给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。如24:22=22(第一次乘),2222=24(第二次乘),所以最少共2次;
输入格式
  第一行m表示有m(1<=m<=100)组测试数据;
  每一组测试数据有一整数n(0<n<=100000000);

  1. #include<cstdio>
  2. using namespace std;
  3. int main(){
  4. int n,d;
  5. scanf("%d",&n)
  6. while(n--){
  7. scanf("%d",&d);
  8. int cnt=0;//利用快速幂的次数最少
  9. while(d!=1){
  10. if(d&1)cnt++;
  11. cnt++;
  12. d>>=1;
  13. }
  14. printf("%d\n",cnt);
  15. }
  16. }

参考博客

  • 蓝桥杯练习(一)
  • 蓝桥杯练习(二)
  • 蓝桥杯练习(三)
  • 蓝桥杯练习(四)

发表评论

表情:
评论列表 (有 0 条评论,107人围观)

还没有评论,来说两句吧...

相关阅读