1575: [蓝桥杯][算法提高VIP]递归倒置字符数组
题目描述
完成一个递归程序,倒置字符数组。并打印实现过程
递归逻辑为:
当字符长度等于1时,直接返回
否则,调换首尾两个字符,在递归地倒置字符数组的剩下部分
输入
字符数组长度及该数组
输出
在求解过程中,打印字符数组的变化情况。
最后空一行,在程序结尾处打印倒置后该数组的各个元素。
样例输入
5 abcde
样例输出
ebcda
edcba
edcba
思路
- 首先要注意题目要求用递归实现,所以在此我就写一个递归,因为要输出中间过程,所以fun函数用了两个字符指针,一个不动,一个一直在移动。
#include <stdio.h>
void cmp(char *p,char *s,int n){
char y;
if(n<=1) return;
y=s[0];s[0]=s[n-1];s[n-1]=y;
puts(p);
cmp(p,s+1,n-2);
}
int main(){
char s[100];
int i,n;
scanf("%d %s",&n,s);
cmp(s,s,n);
printf("
%s
",s);
return 0;
}
1470: [蓝桥杯][基础练习VIP]时间转换
题目描述
给定一个以秒为单位的时间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> ”的格式所表示的时间,不包括引号。
样例输入
5436
样例输出
1:30:36
#include <stdio.h>
int main(){
int t,i;
scanf("%d",&t);
if(t==0){
printf("0:0:0");
}else{
int H=t/3600;
int M=(t%3600)/60;
int S=(t%3600)%60;
printf("%d:%d:%d",H,M,S);
}
return 0;
}
1471: [蓝桥杯][基础练习VIP]矩形面积交
题目描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
#include <stdio.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
int main(){
double a,b,c,d,e,f,g,h;//都要用浮点类型
double m1,n1,m2,n2;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
scanf("%lf %lf %lf %lf",&e,&f,&g,&h);
m1=max(min(a,c),min(e,g));
n1=max(min(b,d),min(f,h));
m2=min(max(a,c),max(e,g));
n2=min(max(b,d),max(f,h));
if(m2>m1 && n2>n1){
printf("%.2lf
",(m2-m1)*(n2-n1));
}else{
printf("0.00
");
}
return 0;
}
1477: 字符串输入输出函数
题目描述
编写函数GetReal和GetString,在main函数中分别调用这两个函数。在读入一个实数和一个字符串后,将读入的结果依次用printf输出。
两次输入前要输出的提示信息分别是" please input a number:
”和" please input a string:
"
输入
无
输出
无
样例输入
9.56
hello
样例输出
please input a number:
please input a string:
9.56
hello
#include <stdio.h>
int main(){
char a[100],b[100];
GetReal(a);
GetString(b);
printf("%s
",a);
printf("%s
",b);
return 0;
}
void GetReal(char *a){
printf("please input a number:
");
scanf("%s",a);
}
void GetString(char *b){
printf("please input a string:
");
scanf("%s",b);
}
1480: [蓝桥杯][算法提高VIP]模拟计算器
题目描述
使用Switch语句编写一个模拟简单计算器的程序。依次输入两个整数和一个字符,并用空格隔开。如果该字 符是一个“+”,则打印和;如果该字符是一个“-”,则打印差;如果该字符是一个“*”,则打印积;如果该字符是“/”,则打印商;如果该字符是一个 “%”,则打印余数。打印结果后输出一个空行。
输入
无
输出
无
样例输入
3 4 +
样例输出
7
#include <stdio.h>
int main(){
int a,b;
char c;
scanf("%d %d %c",&a,&b,&c);
switch(c){
case '+':printf("%d
",a+b);break;
case '-':printf("%d
",a-b);break;
case '*':printf("%d
",a*b);break;
case '/':printf("%d
",a/b);break;
case '%':printf("%d
",a%b);break;
default:break;
}
printf("
");//输出有两个换行
return 0;
}
1481: [蓝桥杯][算法提高VIP]剪刀石头布
题目描述
编写程序实现“剪刀,石头,布”游戏。在这个游戏中,两个人同时说“剪刀”,“石头”或“布”,压过另一方的为胜者。规则是:“布”胜过“石头”,“石头”胜过“剪刀”,“剪刀”胜过“布”。要求:选择结构中使用枚举类型,结果的输出也使用枚举类型表示。
输入
两个数,范围为{0,1,2},用空格隔开。0表示石头,1表示布,2表示剪刀。这两个数分别表示两个人所说的物品。
输出
如果前者赢,输出1。如果后者赢,输出-1。如果是平局,输出0。
样例输入
0 2
样例输出
1
#include <stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
if((a==0&&b==2)|| (a==1&&b==0)||(a==2&&b==1)){
printf("1");
}else if(a==b){
printf("0");
}else{
printf("-1");
}
return 0;
}
1482: [蓝桥杯][算法提高VIP]Pascal三角
题目描述
PASCAL三角是形状如下的三角矩阵:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
在PASCAL三角中的每个数是一个组合C(n,k)。
C(n,k)=(((((((n/1)(n-1))/2(n-2))/3)***(n-k+2))/(k-1))(n-k+1))/k
公式中交替使用乘法和除法,每次将从n开始递减的一个值相乘,然后除以下一个从1开始递增的值。
如果对行和列从0开始计数,则数字C(n,k)在n行k列。例如C(6,2)在第6行第2列。编程输出指定阶数的PASCAL三角矩阵。例如下面给出的是12阶PASCAL三角形矩阵。
编写程序,使运行结果为:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
1 12 66 220 495 792 924 792 495 220 66 12 1
输入
无
输出
无
样例输入
3
样例输出
1
1 1
1 2 1
1 3 3 1
思路:杨辉三角的输出
#include <stdio.h>
int main(){
int a,i,j;
int num[15][15]={0};
scanf("%d",&a);
for(i=0;i<=a;i++)//把第一列和对角线列赋值为1
num[i][0]=num[i][i]=1;
for(i=2;i<=a;i++){//赋值其他列,注意行下标从2开始
for(j=1;j<i;j++){
num[i][j]=num[i-1][j-1]+num[i-1][j];
}
}
for(i=0;i<=a;i++){//输出杨辉三角形
for(j=0;j<a-i;j++){
printf(" ");//输出前面的空格3个
}
for(j=0;j<=i;j++){
printf("%3d ",num[i][j]);
}
printf("
");
}
return 0;
}
1484: [蓝桥杯][算法提高VIP]Quadratic Equation
题目描述
求解方程ax2+bx+c=0的根。要求a, b, c由用户输入,并且可以为任意实数。
输入
输入只有一行,包括三个系数,之间用空格格开。
输出
输出只有一行,包括两个根,大根在前,小根在后,无需考虑特殊情况,保留小数点后两位。
样例输入
2.5 7.5 1.0
样例输出
-0.14 -2.86
#include <stdio.h>
int main(){
double a,b,c,x1,x2,max,min;
scanf("%lf %lf %lf",&a,&b,&c);
x1=((-b)+sqrt(b*b-4*a*c))/(2*a);
x2=((-b)-sqrt(b*b-4*a*c))/(2*a);
max=x1>=x2 ? x1:x2;
min=x1<=x2 ? x1:x2;
printf("%.2lf %.2lf",max,min);
return 0;
}
1511: [蓝桥杯][算法提高VIP]复数求和
题目描述
从键盘读入n个复数(实部和虚部都为整数)用链表存储,遍历链表求出n个复数的和并输出。
输入
无
输出
无
样例输入
3
3 4
5 2
1 3
思路:链表存储,整的很高级似的,其实就是求和。
#include <stdio.h>
int main(){
int n,a,b,i,m=0,f=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d %d",&a,&b);
m=m+a;
f=f+b;
}
printf("%d%+-di
",m,f);
return 0;
}
//%+-d :如果该数是整数则输出 + 反之输出 -
1509: [蓝桥杯][算法提高VIP]图形输出
题目描述
编写一程序,在屏幕上输出如下内容:
X | X | X
—±–±--
| |
—±–±--
O | O | O
注意:本题请同学们严格按照图形的格式输出,对齐,其中X和O为大写,否则系统会判为错误。
输入
无
输出
无
样例输入
无
样例输出
X | X | X
---+---+---
| |
---+---+---
O | O | O
#include <stdio.h>
int main(){
printf(" X | X | X
");
printf("---+---+---
");
printf(" | |
");
printf("---+---+---
");
printf(" O | O | O
");
return 0;
}
1516: [蓝桥杯][算法提高VIP]字符串比较
题目描述
独立实现标准字符串库的strcmp函数,即字符串比较函数,从键盘输入两个字符串,按字典序比较大小,前者大于后者输出1,前者小于后者输出-1,两者相等输出0。
输入
无
输出
无
样例输入
apple one
样例输出
-1
思路: 自己写一个mystrcmp函数实现strcmp函数的功能。
#include<stdio.h>
int strcmp(char a[],char b[]){
int i;
for(i=0;a[i]||b[i];i++){
if(a[i]>b[i]) return 1;
else if(a[i]<b[i]) return -1;
}
return 0;
}
int main(){
char a[100],b[100];
scanf("%s %s",a,b);
printf("%d",strcmp(a,b));
return 0;
}
1532: [蓝桥杯][算法提高VIP]数组输出
题目描述
输入一个3行4列的数组,找出该数组中绝对值最大的元素、输出该元素及其两个下标值。如有多个输出行号最小的,还有多个的话输出列号最小的。
输入
无
输出
无
样例输入
1 2 3 5
-2 5 8 9
6 -7 5 3
样例输出
9 2 4
#include<stdio.h>
int main(){
int sam[4][5];
int i,j,max=-1,x,y;//max小于0
for(i=1;i<=3;i++){
for(j=1;j<=4;j++){
scanf("%d",&sam[i][j]);
if(abs(sam[i][j])>max){
max=abs(sam[i][j]);
x=i;
y=j;
}
}
}
printf("%d %d %d
",max,x,y);
return 0;
}
1547: [蓝桥杯][算法提高VIP]理财计划
题目描述
银行近期推出了一款新的理财计划“重复计息储蓄”。储户只需在每个月月初存入固定金额的现金,银行就会在每个月月底根据储户账户内的金额算出该月的利息并将利息存入用户账号。现在如果某人每月存入k元,请你帮他计算一下,n月后,他可以获得多少收益。
输入
输入数据仅一行,包括两个整数k(100< =k< =10000)、n(1< =n< =48)和一个小数p(0.001< =p< =0.01),分别表示每月存入的金额、存款时长、存款利息。
输出
输出数据仅一个数,表示可以得到的收益。
样例输入
1000 6 0.01
样例输出
213.53
#include<stdio.h>
int main(){
double p,k,n;
scanf("%lf %lf %lf",&k,&n,&p);
double sum=k,a=0,i;
for(i=0;i<n;i++){
a+=k*p;
k+=k*p+sum;
}
a=(int)(a*100);//注意防止四舍五入
printf("%.2lf",a/100);
return 0;
}
1539: [蓝桥杯][算法提高VIP]格式化数据输出
题目描述
编制程序,输出下述数据。
说明:(1)表中数据来自总参谋部测绘局编制的
《世界地图集》(星球地图出版社,2004年1月第2版),数据可能已不准确;
(2)面积单位为万平方公里,人口单位为万人,GDP单位为十亿美元;
(3)表中所有数据都必须以变量的形式保存;(4)如果不知道每字段宽度
到底为多少,请仔细数数作为分隔标记的短横数目。
---------------------------------------------------
COUNTRY AREA(10K km2) POP.(10K) GDP(Billion$)
---------------------------------------------------
China 960.00 129500.00 1080.00
Iceland 10.30 27.57 8.20
India 297.47 97000.00 264.80
Madagascar 62.70 1635.00 3.60
Maldive 0.0298 27.80 0.23
---------------------------------------------------
注意:输出时空格与短线的数量要与上面格式严格一致,否则系统会判为错误。
输入
无
输出
无
样例输入
无
样例输出
无
解题思路:
- 数清楚每个数字所占的位数,用数组将其保存按格式输出
#include<stdio.h>
int main(){
double a[5][3]={{960.00,129500.00,1080.00},{10.30,27.57,8.20},
{297.47,97000.00,264.80},{62.70,1635.00,3.60},{0.0298,27.80,0.23}};
printf("---------------------------------------------------
");
printf("COUNTRY AREA(10K km2) POP.(10K) GDP(Billion$)
");
printf("---------------------------------------------------
");
printf("China %12.2lf%11.2lf %.2lf
",a[0][0],a[0][1],a[0][2]);
printf("Iceland %12.2lf%11.2lf %.2lf
",a[1][0],a[1][1],a[1][2]);
printf("India %12.2lf%11.2lf %.2lf
",a[2][0],a[2][1],a[2][2]);
printf("Madagascar %12.2lf%11.2lf %.2lf
",a[3][0],a[3][1],a[3][2]);
printf("Maldive %12.4lf%11.2lf %.2lf
",a[4][0],a[4][1],a[4][2]);
printf("---------------------------------------------------
");
return 0;
}
1543: [蓝桥杯][算法提高VIP]淘淘的名单
题目描述
淘淘拿到了一份名单,他想对上面的名字进行处理,挑出一些特殊的名字,他请你来帮忙。
淘淘关注以下名字:
如果这个名字是“WYS”,他希望你的程序输出“KXZSMR”。
如果这个名字是“CQ”,他希望你的程序输出“CHAIQIANG”。
如果这个名字是“LC“,他希望你的程序输出“DRAGONNET”。
如果这个名字是“SYT”或“SSD”或“LSS”或“LYF”,他希望你的程序输出“STUDYFATHER”。
如果这个名字与上述任意名字都不相同,他希望你的程序输出“DENOMINATOR”。
数据规模和约定
对于 100% 数据,N < = 10000,人名仅由大写字母组成,长度不超过5。
输入
第一行有一个整数N,表示淘淘手中名单里的人数。
接下来N行,每行有一个字符串,即名单里的人名。
输出
输出N行,每行输出每个人名的判断结果。
样例输入
9
WYS
CQ
WYS
LC
SYT
SSD
LSS
LYF
ZBY
样例输出
KXZSMR
CHAIQIANG
KXZSMR
DRAGONNET
STUDYFATHER
STUDYFATHER
STUDYFATHER
STUDYFATHER
DENOMINATOR
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
char a[10000][5];
for(i=0;i<n;i++){
scanf("%s",a[i]);
}
for(i=0;i<n;i++){
if(!strcmp(a[i],"WYS"))printf("KXZSMR
");
else if(!strcmp(a[i],"CQ"))printf("CHAIQIANG
");
else if(!strcmp(a[i],"LC"))printf("DRAGONNET
");
else if(!strcmp(a[i],"SYT"))printf("STUDYFATHER
");
else if(!strcmp(a[i],"SSD"))printf("STUDYFATHER
");
else if(!strcmp(a[i],"LSS"))printf("STUDYFATHER
");
else if(!strcmp(a[i],"LYF"))printf("STUDYFATHER
");
else printf("DENOMINATOR
");
}
return 0;
}