蓝桥杯练习(五)
蓝桥杯练习(五)
- 天数计算
- 求和求平均值
- 字符串长度
- 第五次作业:字符串排序
- 多阶乘计算
- 数字游戏
- 乘法次数
- 参考博客
天数计算
问题描述
编写函数求某年某月某日(**** ** **)是这一年的第几天 。提示:要考虑闰年,闰年的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);
}
}
参考博客
- 蓝桥杯练习(一)
- 蓝桥杯练习(二)
- 蓝桥杯练习(三)
- 蓝桥杯练习(四)
还没有评论,来说两句吧...