蓝桥杯练习(五)

天数计算

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

#include <bits/stdc++.h>
using namespace std;

/**
 *@brief 判断year年是否为闰年
*/
bool isLeap(int year){
    return (year%4==0&&year%100!=0)||(year%400==0);
}

int main(){
    int y,m,d;
    int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    cin>>y>>m>>d;
    if(isLeap(y))months[2]++;
    int sum=0;
    for(int i=1;i<m;++i)sum+=months[i];
    cout<<sum+d;
    
}

求和求平均值

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

#include <bits/stdc++.h>
using namespace std;


/**
 *@brief 对数组求平均值
*/
template<class T>
T mean(T a[],int n){
    T x=0;
    for(int i=0;i<n;++i)x+=a[i];
    return x/n;
}

/**
 * @brief 求数组的和
*/
template<class T>
T sum(T a[],int n){
    T x = 0;
    for(int i=0;i<n;++i)x+=a[i];
    return x;
}

int main(){
    double x[10];
    for(int i=0;i<10;++i)cin>>x[i];
    cout<<sum(x,10)<<endl<<mean(x,10);
}

字符串长度

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

#include <cstdio>
using namespace std;

/**
 * @brief 求字符串的长度
 */
int length(char c[]){
    int i =0;
    while(c[i])i++;
    return i;
}

int main(){
    char str[101];
    gets(str);
    printf("%d",length(str));
}

第五次作业:字符串排序

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

#include <cstdio>
using namespace std;

/**
 * @brief 求字符串的长度
*/
int length(char c[]){
    int i =0;
    while(c[i])i++;
    return i;
}

/**
 * @brief 交换
*/
template<class T>
void swap(T&a,T&b){
    T c = a;
    a = b;
    b = c;
}

/**
 * @brief 对字符串进行排序
 */
int sort(char c[]){
    int len = length(c);
    for(int i=0;i<len-1;++i){
        for(int j=0;j<len-i-1;++j){
            if(c[j]>c[j+1])swap(c[j],c[j+1]);
        }
    }
}


int main(){
    char str[1001];
    gets(str);
    sort(str);
    printf("%s",str);
}

多阶乘计算

问题描述
  我们知道,阶乘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。

#include <cstdio>
using namespace std;
typedef long long ll;



int main(){
    int n,m,k;
    ll sum=0,d;
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=k;++i){
        d = 1;
        for(int j=n;j>1;j-=i)d*=j;
        sum+=d;
    }
    if(m==1)printf("%lld",sum);
    else {
        d = 0;
        while(sum){
            d+=sum%10;
            sum/=10;
        }
        printf("%lld",d);
    } 
    return 0;
}

数字游戏

问题描述
  给定一个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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

/**
 * @brief 令a[i]+=a[i+1]
*/
void perSum(int a[],int n){
    for(int i=0;i<n;++i)a[i]+=a[i+1];
}


int main(){
    int n,sum;
    scanf("%d%d",&n,&sum);
    int a[10],d[10];
    for(int i=0;i<n;++i)a[i]=i+1;
    do{
        for(int i=0;i<n;++i)d[i]=a[i];
        for(int i=n-1;i>0;--i)perSum(d,i);
        if(d[0]==sum){
            for(int i=0;i<n-1;++i)printf("%d ",a[i]);
            printf("%d\n",a[n-1]);
            break;
        }
    }while(next_permutation(a,a+n));
    return 0;
}

乘法次数

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

#include<cstdio>
using namespace std;

int main(){
    int n,d;
    scanf("%d",&n)
    while(n--){
        scanf("%d",&d);
        int cnt=0;//利用快速幂的次数最少
        while(d!=1){
            if(d&1)cnt++;
            cnt++;
            d>>=1;
        }
        printf("%d\n",cnt);
    }
}

参考博客

发布了277 篇原创文章 · 获赞 70 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41146650/article/details/105176664