一、基础练习 数列排序
问题描述
给定一个长度为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;
}