蓝桥杯练习------基础练习

一、基础练习  数列排序 

问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
 

陌生知识点:sort函数,数组用法,sort(a,a+n)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	int a[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]); 
	}
	sort(a,a+n);  // 排序函数 
	for(int i=0;i<n;i++)
	   printf("%d ",a[i]);
	return 0;
 } 

二、基础练习  时间转换

问题描述

给定一个以秒为单位的时间t,要求用“< H>:< M>:< S>”的格式来表示这个时间。< H>表示时间,< M>表示分钟,而< S>表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。

输入格式

输入只有一行,是一个整数t(0<=t<=86399)。

输出格式  
输出只有一行,是以“< H>:< M>:< S>”的格式所表示的时间,不包括引号。

样例输入

0

样例输出

0:0:0

样例输入

5436

样例输出1:30:36
 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t,h,m,s;
	scanf("%d",&t);
	h=t/3600;
	m=t%3600/60;
	s=t%3600%60;
	 printf("%d:%d:%d",h,m,s);
	return 0;
 }

三、基础练习  字符串对比

给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
  1:两个字符串长度不等。比如 Beijing 和 Hebei
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。

输入格式

  包括两行,每行都是一个字符串

输出格式

  仅有一个数字,表明这两个字符串的关系编号

样例输入

BEIjing

beijing

样例输出

3

陌生知识点:

(1)compare函数

string字符串比较

字符串比较是按字符的ASCII码进行对比

= 返回 0

> 返回 1

< 返回 -1

(2)tolower函数

(toupper函数用法相似,不过,是把小写字母转换成大写字母)

1.把大写字母转换成小写字母(如ABC==>abc)

2.非字母字符不做出处理(如 1,2,3等)

3.不能直接处理字符串,处理的时候对字符串必须是一个一个字符处理的,不能一次性对字符串进行处理。(如下面代码中演示)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s1,s2;
	cin>>s1>>s2;
	int len1=s1.length();
	int len2=s2.length();
	if(len1!=len2) 
	{
		printf("1");
		return 0;
	}
	int ret=s1.compare(s2);  //比较字符串函数,相同则为0
	if(ret==0)
	{
		printf("2");
		return 0;
	}
	int flag=1;
	for(int i=0;i<len1;i++)
	{
		s1[i]=tolower(s1[i]);   // 字符的小写形式,大写形式为函数toupper
		s2[i]=tolower(s2[i]);
		if(s1[i]!=s2[i])
		{
			flag=0;
			break;
		}
	}
	if(flag==1) printf("3");
	if(flag==0) printf("4");
	
	return 0;
 }

四、基础练习  分解质因数

问题描述
  求出区间[a,b]中所有整数的质因数分解。
输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
  先筛出所有素数,然后再分解。
数据规模和约定
  2<=a<=b<=10000

 陌生知识点:

(1)sqrt函数

一个非负实数的平方根运算

(2)vector容器

1.和数组用法差不多,但是要比数组方便

2.  vector<T> v  构造函数,T为vector类型。如int,float,string等,v为vector容器的名字

3.v.push_back()  赋值操作

4.v.size()  返回容器中元素的个数

(3)  bool函数

bool函数返回的只有true和false 

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

bool isprime(int n)
{
	int m=sqrt(n);
	for(int i=2;i<=m;i++)
	{
		if(n%i==0)
		  return false;
	}
	return true;
}

int main()
{
	int a,b,temp;
	vector<int> prime;
	scanf("%d%d",&a,&b);
	for(int i=2;i<=b;i++) //找出到从2到b的所有素数,构建素数表 
	{
		if(isprime(i))
		{
			prime.push_back(i);
		}
	}
	for(int i=a;i<=b;i++)  //求区间[a,b]中所有整数的质因数分解
	{
		temp=i;
	    printf("%d=",i);
		for(int j=0;j<prime.size();) //利用素数表,找出每个整数的质因数 
	    {
			if(temp%prime[j]==0)  
			{
				temp/=prime[j];          //如果该数是素数,则temp变为1 ,
				printf("%d",prime[j]);     //或者如果只剩最小的因数了,temp也变为1 
				if(temp!=1) printf("*");   //为了判断 * 是否输出
			}
			else  
			{
				j++;
			}
		}
		printf("\n");
	}
	return 0;
}

五、基础练习 矩阵乘法

问题描述
  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
  例如:
  A =
  1 2
  3 4
  A的2次幂
  7 10
  15 22
输入格式
  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
  接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
资源限制
时间限制:1.0s 内存限制:512.0MB
 

 做题思路:  代码来自  矩阵知识

1.输入矩阵,并给b矩阵赋相同的值 

2.分情况讨论

(1)当求矩阵的0次幂,即m=0时 ,矩阵的0次幂为单元矩阵

(2)当求矩阵的1次幂,即m=1时 ,矩阵的1次幂为它本身

(3) 当求矩阵的m>=2次幂时

  1、t的每一行的每一列等于a的每一行的每一列乘以b的每一列的每一行之和

               t [ i ] [ j ] +=b [ i ] [ k-1 ] * a [ k-1 ] [ j ]

关键算法:

int k=n;
while(k)
{
	//t的每一行的每一列等于a的每一行的每一列乘以b的每一列的每一行之和 
	t[i][j]+=b[i][k-1]*a[k-1][j];
	k--;
					
}

2、把t矩阵赋值给b矩阵,接着相乘,并初始化t矩阵(本人感觉也很巧妙!)

		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				b[i][j]=t[i][j];//把t矩阵赋值给b矩阵 
				t[i][j]=0;//并初始化t矩阵 
			}
		}

完整代码: 

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

int main()
{
	int a[35][35];
	int b[35][35];
	int t[35][35];
	int n,m;
	scanf("%d%d",&n,&m);
	int i,j,k;
	for(i=0;i<n;i++)//1.输入矩阵,并给b矩阵赋相同的值 
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
			b[i][j]=a[i][j];
		}
	}
	if(m==0)//2.分情况讨论 (1)当求矩阵的0次幂,即m=0时 
	{
		for(i=0;i<n;i++)//矩阵的0次幂为单元矩阵 
		{
			for(j=0;j<n;j++)
			{
				if(i==j)  printf("1 ");
				else  printf("0 ");
			}
			printf("\n");
		}
		return 0;
	}
	if(m==1) //2.(2)当求矩阵的1次幂,即m=1时 
	{
		for(i=0;i<n;i++) //矩阵的1次幂为它本身 
		{
			for(j=0;j<n;j++)
			{
				printf("%d",a[i][j]);
			}
			printf("\n");
		}
		return 0;
	}
	while(m>=2)//2.(3) 当求矩阵的m>=2次幂时 
	{
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				int k=n;
				while(k)
				{
					//t的每一行的每一列等于a的每一行的每一列乘以b的每一列的每一行之和 
					t[i][j]+=b[i][k-1]*a[k-1][j];
					k--;
					
				}
			}
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				b[i][j]=t[i][j];//把t矩阵赋值给b矩阵 
				t[i][j]=0;//并初始化t矩阵 
			}
		}
		m--;
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			printf("%d ",b[i][j]);
		}
		printf("\n");
	}
	return 0;
 }

六、基础练习  矩形面积交

问题描述
  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
  输入仅包含两行,每行描述一个矩形。
  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
  输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
资源限制
时间限制:1.0s 内存限制:512.0MB
 

 知识点:swap,交换函数;sort,排序函数

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

int main()
{
	double x1,y1,x2,y2,x3,y3,x4,y4;
	scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
	if(x1>x2)  swap(x1,x2);    //交换函数
	if(y1>y2)  swap(y1,y2);
	if(x3>x4)  swap(x3,x4);
	if(y3>y4)  swap(y3,y4);
	double a[4]={x1,x2,x3,x4};
	double b[4]={y1,y2,y3,y4};
	sort(a,a+4);      //排序函数
	sort(b,b+4);
	double s=(a[2]-a[1])*(b[2]-b[1]);
	printf("%.2lf",s);
	return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值