PTA-暑期学校-Day3-C语言
1 调和平均
N 个正数的算数平均是这些数的和除以 N,它们的调和平均是它们倒数的算数平均的倒数。请计算给定的一系列正数的调和平均值。
要求:
- 输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (≤1000);第 2 行给出 N 个正数,都在区间 [0.1,100] 内。 - 输出格式:
在一行中输出给定数列的调和平均值,输出小数点后2位。 - 输入样例:
8
10 15 12.7 0.3 4 13 1 15.6
- 输出样例:
1.61
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N;
float p,q=0;
scanf("%d",&N);
double a[1000];
for(int i=1;i<=N;i++)
{
scanf("%lf",&a[i]);
p=p+1/a[i];//算术平均*N
}
q=1/(p/N);//调和平均
printf("%.2f",q); //小数点后2位
return 0;
}
2 编程打印空心字符菱形
要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。所谓“空心菱形”是指:每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。
要求:
- 输入格式:
输入在一行中给出起始字母(范围为英文大写字母A-G)和菱形的高度(为不超过10的奇数)。 - 输出格式:
输出空心字符菱形。 - 输入样例:
B 5
- 输出样例:
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char c;//起始字母
int N;//高度
scanf("%c %d",&c,&N);
for(int i=1;i<=N/2+1;i++)
{
for(int j=N/2;j>=i;j--)
printf(" ");
for(int j=0;j<i*2-1;j++)
{
if(j==0||j==i*2-2)
printf("%c",c);
else
printf(" ");
}
c=c+1;
printf("\n");
}
c=c-1;
for(int i=1;i<=N/2;i++)
{
c-=1;
for(int j=1;j<=i;j++)
printf(" ");
for(int j=N-2;j>=i*2-1;j--)
{
if(j==N-2||j==i*2-1)
printf("%c",c);
else
printf(" ");
}
printf("\n");
}
}
3 求1到N的和
编写程序,计算序列 1 + 2 + 3 + … 的前N项之和。
要求:
- 输入格式:
输入在一行中给出一个正整数N。 - 输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,请注意等号的左右各有一个空格。题目保证计算结果不超过长整型整数的范围。 - 输入样例:
100
- 输出样例:
sum = 5050
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N,sum;
scanf("%d",&N);
sum=N*(N+1)/2;
printf("sum = %d",sum);
return 0;
}
4 就不告诉你
编写程序,对任何一对给定的正整数,倒着输出它们的乘积。
要求:
- 输入格式:
输入在第一行给出两个不超过 1000 的正整数 A 和 B,其间以空格分隔。 - 输出格式:
在一行中倒着输出 A 和 B 的乘积。 - 输入样例:
5 7
- 输出样例:
53
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int A,B;
scanf("%d %d",&A,&B);
int x,y,flag=1;
x=A*B;
while(x)
{
y=x%10;
x=x/10;
if(flag==1&&!y)
continue;
if(flag==1&&y)
flag=0;
printf("%d",y);
}
return 0;
}
5 打印九九口诀表
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本题要求对任意给定的一位正整数 N,输出从 1*1 到 N*N 的部分口诀表。
要求:
- 输入格式:
输入在一行中给出一个正整数 N (1≤ N ≤9)。 - 输出格式:
输出下三角 N*N 部分口诀表,其中等号右边数字占4位、左对齐。 - 输入样例:
4
- 输出样例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
for(int j=1;j<=i;j++)
{
printf("%d*%d=%-4d",j,i,i*j);
}
if(i!=N)
printf("\n");
}
return 0;
}
6 约分最简分式
分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
要求:
- 输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠 / 分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:
对于C语言,在scanf的格式字符串中加入/,让scanf来处理这个斜杠 / 。
对于Python语言,用 a,b=map(int, input().split(‘/’)) 这样的代码来处理这个斜杠。 - 输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如5/6表示6分之5。 - 输入样例:
66/120
- 输出样例:
11/20
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x,y;
scanf("%d/%d",&x,&y);
for(int i=2;i<=x;i++)
{
while(x%i==0&&y%i==0)
{
x=x/i;
y=y/i;
}
}
printf("%d/%d",x,y);
return 0;
}
7 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出 fu 字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
要求:
- 输入格式:
输入在一行中给出一个整数,如: 1234 。
提示:整数包括负数、零和正数。 - 输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si 。 - 输入样例:
-600
- 输出样例:
fu liu ling ling
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char n[100];
scanf("%s",&n);
int i;
int l=strlen(n);
if(n[0]=='-')
printf("fu "),i=1;
else
i=0;
for(i;i<l;i++)
{
switch(n[i]-48)
{
case 0: printf("ling");break;
case 1: printf("yi");break;
case 2: printf("er");break;
case 3: printf("san");break;
case 4: printf("si");break;
case 5: printf("wu");break;
case 6: printf("liu");break;
case 7: printf("qi");break;
case 8: printf("ba");break;
case 9:printf("jiu");break;
default:break;
}
if(i<l-1)
printf(" ");
}
return 0;
}
8 单词首字母大写
本题目要求编写程序,输入一行字符,将每个单词的首字母改为大写后输出。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
要求:
- 输入格式:
输入给出一行字符。 - 输出格式:
在一行中输出已输入的字符,其中所有单词的首字母已改为大写。 - 输入样例:
How are you?
- 输出样例:
How Are You?
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[10000];
gets(a);
if(a[0]>='a'&&a[0]<='z')
a[0]=a[0]-32;
int l=strlen(a);
for(int i=1;i<=l;i++)
{
if(a[i-1]==' '&&a[i]>='a'&&a[i]<='z')
{
a[i]=a[i]-32;
}
}
puts(a);
return 0;
}
9 统计单词的长度
本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
要求:
- 输入格式:
输入给出一行字符。 - 输出格式:
在一行中输出每个单词的长度。每个数字后有一个空格。 - 输入样例:
How are you?
- 输出样例:
3 3 4
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main ()
{
char a[10000];
gets(a);
int n=0,flag=1;
int l=strlen(a);
a[l]='\0';
for(int i=0;i<=l;i++)
{
if (a[i]!=' '&&a[i]!='\0')
n++;
else
{
if(n)
{
printf("%d ",n);
n=0;
flag=0;
}
}
}
if(flag)
printf("0 ");
return 0;
}
10 不变初心数
不变初心数是指这样一种特别的数,它分别乘 2、3、4、5、6、7、8、9 时,所得乘积各位数之和却不变。例如 18 就是这样的数:18 的 2 倍是 36,3+6=9;18 的 3 倍是 54,5+4=9;…… 18 的 9 倍是 162,1+6+2=9。对于 18 而言,9 就是它的初心。本题要求你判断任一个给定的数是否有不变的初心。
要求:
- 输入格式:
输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一个不超过 105 的正整数。 - 输出格式:
对每个给定的数字,如果它有不变的初心,就在一行中输出初心;否则输出 NO 。 - 输入样例:
4
18
256
99792
88672
- 输出样例:
9
NO
36
NO
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N;
scanf("%d",&N);
int sum,s,x,y,c;
for(int i=1;i<=N;i++)
{
scanf("%d",&x);
y=x;
sum=0;
while(y)
{
sum=sum+y%10;
y=y/10;
}
s=sum;
c=0;
for(int j=2;j<=9;j++)
{
y=x*j;
sum=0;
while(y)
{
sum=sum+y%10;
y=y/10;
}
if(sum==s)
c++;
}
if(c==8)
printf("%d\n",s);
else
printf("NO\n");
}
return 0;
}
11 胎压监测
小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。
让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。报警规则如下:
1、如果所有轮胎的压力值与它们中的最大值误差在一个给定阈值内,并且都不低于系统设定的最低报警胎压,则说明情况正常,不报警;
2、如果存在一个轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则不仅要报警,而且要给出可能漏气的轮胎的准确位置;
3、如果存在两个或两个以上轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则报警要求检查所有轮胎。
要求:
- 输入格式:
输入在一行中给出 6 个 [0, 400] 范围内的整数,依次为 1~4 号轮胎的胎压、最低报警胎压、以及胎压差的阈值。 - 输出格式:
根据输入的胎压值给出对应信息:
如果不用报警,输出 Normal ;
如果有一个轮胎需要报警,输出 Warning: please check #X! ,其中 X 是出问题的轮胎的编号;
如果需要检查所有轮胎,输出 Warning: please check all the tires! 。 - 输入样例1:
242 251 231 248 230 20
- 输出样例1:
Normal
- 输入样例2:
242 251 232 248 230 10
- 输出样例2:
Warning: please check #3!
- 输入样例3:
240 251 232 248 240 10
- 输出样例3:
Warning: please check all the tires!
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a[4];
int x,y;
scanf("%d %d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&x,&y);
int max=a[0];
for(int i=1;i<4;i++)
{
if(max<a[i])
{
max=a[i];
}
}
int c=0;
int index=0;
for(int i=0;i<4;i++)
{
if(max-a[i]>y||a[i]<x)
{
c++;
index=i;
}
}
if(c==0)
printf("Normal\n");
if(c==1)
printf("Warning: please check #%d!",index+1);
if(c>=2)
printf("Warning: please check all the tires!\n");
}
12 验证“哥德巴赫猜想”
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
要求:
- 输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。 - 输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。 - 输入样例:
24
- 输出样例:
24 = 5 + 19
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
int p;
int flag;
for(int i=2;i<=n/2;i++)
{
flag=1;
if(p==1||p%2==0&&p!=2)
flag=0;
else
{
for(int i=3;i<=sqrt(p);i+=2)
{
if(p%i==0)
{
flag=0;
break;
}
}
}
flag=1;
if(n-p==1||n-p%2==0&&n-p!=2)
flag=0;
else
{
for(int i=3;i<=sqrt(n-p);i+=2)
{
if((n-p)%i==0)
{
flag=0;
break;
}
}
}
printf("%d = %d + %d\n",n,p,n-p);
break;
}
return flag;
}
13 找完数
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
要求:
- 输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。 - 输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。 - 输入样例:
2 30
- 输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n;
scanf("%d %d",&m,&n);
int sum=1,flag=0;
for(int i=m;i<=n;i++)
{
sum=1;
for(int j=2;j<i;j++)
{
if(i%j==0)
sum=sum+j;
}
if(sum==i)
{
flag=1;
printf("%d = 1",i);
for(int j=2;j<i;j++)
if(i%j==0)
printf(" + %d",j);
printf("\n");
}
}
if(flag==0)
printf("None\n");
return 0;
}
14 英文单词排序
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
要求:
- 输入格式:
输入为若干英文单词,每行一个,以 # 作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。 - 输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。 - 输入样例:
blue
red
yellow
green
purple
- 输出样例:
red blue green yellow purple
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,i,j;
char a[20][10]={'\0'};
char t[10]={'\0'};
while(1)
{
scanf("%s",&a[i]);
if (a[i][0]=='#')
break;
i++;
n=i;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++)
if(strlen(a[j-1])>strlen(a[j]))
{
strcpy(t,a[j-1]);
strcpy(a[j-1],a[j]);
strcpy(a[j],t);
}
}
for(i=0;i<n;i++)
printf("%s ",a[i]);
return 0;
}
15 用扑克牌计算24点
一副扑克牌的每张牌表示一个数(J、Q、K 分别表示 11、12、13,两个司令都表示 6)。任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4 个数顺序可以任意组合,4 个运算符任意取 3 个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为 24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出 -1 表示无解。
要求:
- 输入格式:
输入在一行中给出 4 个整数,每个整数取值在 [1, 13]。 - 输出格式:
输出任一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出 -1。 - 输入样例:
2 3 12 12
- 输出样例:
((3-2)*12)+12
代码长度限制 16KB
时间限制 400ms
内存限制 64MB
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
float OP(float a,float b,char c)
{
float sum=0;///四种运算符,分情况说明
switch(c)
{
case '+': sum=a+b;break;
case '-': sum=a-b;break;
case '*': sum=a*b;break;
case '/': sum=a/b;break;
}
return sum;
}
int NUM(char*a,float*num)///分五种情况说明,最终运算结果等于24
{
float x=0,y=0,sum=0;
for(int i=0; i<4; ++i)
for(int j=0; j<4; ++j)
for(int k=0; k<4; ++k)
for(int l=0; l<4; ++l)
if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l)
{
x=OP(num[i],num[j],*a);
y=OP(x,num[k],*(a+1));
sum=OP(y,num[l],*(a+2));
if(sum==24)///一
{
printf("((%f%c%f)%c%f)%c%f",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
return 1;
}
x=OP(num[j],num[k],*(a+1));
y=OP(num[i],x,*a);
sum=OP(y,num[l],*(a+2));
if(sum==24)///二
{
printf("(%.0f%c(%.0f%c%.0f))%c%.0f",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
return 1;
}
x=OP(num[i],num[j],*a);
y=OP(num[k],num[l],*(a+2));
sum=OP(x,y,*(a+1));
if(sum==24)///三
{
printf("(%.0f%c%.0f)%c(%.0f%c%.0f)",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
return 1;
}
x=OP(num[k],num[l],*(a+2));
y=OP(num[j],x,*(a+1));
sum=OP(num[i],y,*a);
if(sum==24)///四
{
printf("%.0f%c(%.0f%c(%.0f%c%.0f))",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
return 1;
}
x=OP(num[j],num[k],*(a+1));
y=OP(x,num[l],*(a+2));
sum=OP(num[i],y,*a);
if(sum==24)///五
{
printf("%.0f%c((%.0f%c%.0f)%c%.0f)",num[i],*a,num[j],*(a+1),num[k],*(a+2),num[l]);
return 1;
}
}
return 0;
}
int main(void)///主函数输出
{
char a[4]="+-*/";
char b[64][5];
float num[4];
int i=0,j=0,k=0,l=0,m=0;
int count=0;
for(i=0; i<4; ++i)
scanf("%f",&num[i]);
for(i=0; i<4; ++i)
for(j=0; j<4; ++j)
for(k=0; k<4; ++k)
{
b[l][m]=a[i];
b[l][m+1]=a[j];
b[l][m+2]=a[k];
++l;
}
for(i=0; i<64; ++i)
if(NUM(b[i],num))
return 0;
printf("-1");///没有解决方案,所以输出“-1”
return 0;
}