2019年刚学c的一些题目整理。
入门
R7-2 宇宙无敌大招呼
据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。
输入格式: 输入在第一行给出一个星球的名字S,是一个由不超过7个英文字母组成的单词,以回车结束。
输出格式: 在一行中输出Hello S,跟输入的S星球打个招呼。
输入样例:
Mars
输出样例:
Hello Mars
代码:
#include<stdio.h>
int main()
{
char s[7];
scanf("%s",s);
printf("Hello %s",s);
return 0;
}
R7-6 计算平均分
已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。
输入格式: 本题无输入
输出格式:
math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩
代码:
#include<stdio.h>
int main()
{
int math, eng, comp, average;
math=87;
eng=72;
comp=93;
average=(math+eng+comp)/3;
printf("math = 87, eng = 72, comp = 93, average = %d",average);
return 0;
}
R7-10 逆序的三位数
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式: 每个测试是一个3位的正整数。
输出格式: 输出按位逆序的数。
输入样例:
123
输出样例:
321
代码:
#include <stdio.h>
int main(void)
{
int temp=0,number=0;
scanf("%d",&number);
if(number%10!=0)
{
temp=number%10*100;
}
number/=10;
if(number%10!=0)
{
temp+=number%10*10;
}
number/=10;
if(number%10!=0)
{
temp+=number%10;
}
printf("%d",temp);
return 0;
}
选择
2-02 比较大小
本题要求将输入的任意3个整数从小到大输出。
输入格式: 输入在一行中给出3个整数,其间以空格分隔。
输出格式: 在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
代码:
#include <stdio.h>
int main()
{
int a,b,c,s;
scanf("%d %d %d",&a,&b,&c);
if(b>=c)
{
s=b;
b=c;
c=s;
}
if(a>=b)
{
s=a;
a=b;
b=s;
if(b>=c)
{
s=b;
b=c;
c=s;
}
}
printf("%d->%d->%d",a,b,c);
return 0;
}
2-06 计算火车运行时间
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
输入格式: 输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
输出格式: 在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
输入样例:
1201 1530
输出样例:
03:29
代码:
#include<stdio.h>
int main()
{
int s,e,hh,mm;
scanf("%d %d",&s,&e);
if((s-s/100*100)>(e-e/100*100))
{
hh=(e/100-s/100)-1;
mm=60-(s-s/100*100)+(e-e/100*100);
}
else
{
hh=(e/100)-(s/100);
mm=(e-e/100*100)-(s-s/100*100);
}
if(hh<10)
{ if(mm<10)
{printf("0%d:0%d",hh,mm);}
else
{printf("0%d:%d",hh,mm);}
}
else if(mm<10)
{printf("%d:0%d",hh,mm);}
else
printf("%d:%d",hh,mm);
return 0;
}
2-11 两个数的简单计算器
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式: 输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式: 当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
输入样例1:
-7 / 2
输出样例1:
-3
输入样例2:
3 & 6
输出样例2:
ERROR
代码:
#include<stdio.h>
int main(void)
{
int a,b;
char operate;
scanf("%d %c %d", &a, &operate, &b);
switch (operate)
{
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 :
printf("ERROR");
}
return 0;
}
循环
6-01 输出华氏-摄氏温度转换表
输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。 温度转换的计算公式:C=5×(F?32)/9,其中:C表示摄氏温度,F表示华氏温度。
输入格式: 在一行中输入2个整数,分别表示lower和upper的值,中间用空格分开。
输出格式: 第一行输出:“fahr celsius”
接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。
若输入的范围不合法,则输出"Invalid."。
输入样例1:
32 35
输出样例1:
fahr celsius
32 0.0
34 1.1
输入样例2:
40 30
输出样例2:
Invalid.
代码:
#include <stdio.h>
int main()
{
int lower,upper;
float c,f;
scanf("%d %d",&lower,&upper);
if(lower>upper || upper>100 || lower>100)
{
printf("Invalid.");
}
else
{ printf("fahr celsius\n");
for (f=lower;f<=upper;f=f+2)
{
c = 5 *(f-32)*1.0/ 9;
printf("%.f%6.1f\n",f,c);
}
}
return 0;
}
6-03 求阶乘序列前N项和
本题要求编写程序,计算序列 1!+2!+3!+? 的前N项之和。
输入格式: 输入在一行中给出一个不超过12的正整数N。
输出格式: 在一行中输出整数结果。
输入样例:
5
输出样例:
153
代码:
#include <stdio.h>
int main()
{
int n=0,x=1,s1=1,s2=0,y=1;
scanf("%d",&n);
for(;x<=n;x++)
{
for(;y<=x;y++)
{s1=s1*y;}
s2=s1+s2;
}
printf("%d",s2);
return 0;
}
6-05 统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式: 输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,i,m,l=0,sum=0,num=0;
scanf("%d %d",&a,&b);
for(i=a;i<=b;i++)
{for(m=1;m<=i;m++)
{
if(i%m!=0) l++;
}
if(l==i-2)
{
sum=sum+i; num++;
}
l=0;
}
printf("%d %d",num,sum);
return 0;
}
6-06 猴子吃桃问题
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式: 输入在一行中给出正整数N(1<N≤10)。
输出格式: 在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
代码:
#include <stdio.h>
int main()
{
int n,sum=1,i=1;
scanf("%d",&n);
for(;i<=n-1;++i)
{sum=2*(sum+1);}
printf("%d",sum);
return 0;
}
函数
7-1 简单阶乘计算
本题要求实现一个计算非负整数阶乘的简单函数。
函数接口定义:
int Factorial( const int N );
其中N是用户传入的参数,其值不超过12。如果N是非负整数,则该函数必须返回N的阶乘,否则返回0。
裁判测试程序样例:
#include <stdio.h>
int Factorial( const int N );
int main()
{
int N, NF;
scanf("%d", &N);
NF = Factorial(N);
if (NF) printf("%d! = %d\n", N, NF);
else printf("Invalid input\n");
return 0;
}
输入样例:
5
输出样例:
5! = 120
代码:
int Factorial( const int N )
{ int n=N;
int NF=1;
if(n<0 || n>12)
return 0;
else
{ if(n==0 || n==1)
{return NF;}
else
{while(n>0)
{ NF=NF*n;
n--;
}
return NF;
}
}
return NF;
}
7-14 十进制转换二进制
本题要求实现一个函数,将非负整数n转换为二进制后输出。
函数接口定义:
void dectobin( int n );
函数dectobin应在一行中打印出二进制的n。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
void dectobin( int n );
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
输入样例:
10
输出样例:
1010
代码:
void dectobin( int n )
{
int result=0;
if(n==0)
{
printf("0");
} else if(n==1)
{
printf("1");
}
else
{
dectobin(n/2);
result=n%2;
printf("%d",result);
}
}
数组
8-01 查找指定字符
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式: 输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式: 如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1:
m
programming
输出样例1:
index = 7
输入样例2:
a
1234
输出样例2:
Not Found
代码:
#include <stdio.h>
int main()
{
int i, index, count;
char a, ch, str[80];
scanf("%c\n", &a);
i=0;
index=-1;
count=0;
ch=getchar();
for(i=0; ch!='\n'; i++){
str[i]=ch;
count++;
ch=getchar();
}
for(i=0; i<count; i++)
if(a==str[i])
index=i;
if(index!=-1)
printf("index = %d", index);
else
printf("Not Found");
return 0;
}
8-02 选择法排序
本题要求将给定的n个整数从大到小排序后输出。
输入格式: 输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式: 在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例: 4 5 1 7 6 输出样例: 7 6 5 1
代码:
#include <stdio.h>
int main()
{
int n,j,i,t;
int num[10];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
for(j=0;j<n-1;j++)
{
for(i=j+1;i<n;i++)
{
if(num[j]<num[i])
{t=num[j];
num[j]=num[i];
num[i]=t;
}
}
}
printf("%d",num[0]);
for(i=1;i<n;i++)
{printf(" %d",num[i]);}
return 0;
}
8-3 判断上三角矩阵
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。 本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式: 输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式: 每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例:
3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6
输出样例:
YES
NO
NO
代码:
#include <stdio.h>
int MatScan(int n,int str[10][10]);
int MatJudge(int n,int str[10][10]);
int main()
{
int T,n,j,i;
int str[10][10];
scanf("%d",&T);
for(j=0;j<T;j++)
{ scanf("%d",&n);
str[10][10]=MatScan(n,str);
if(MatJudge(n,str)==0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
int MatScan(int n,int str[10][10])
{int i,j;
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
scanf("%d",&str[j][i]);
}
return str[10][10];
}
int MatJudge(int n,int str[10][10])
{
int j,i,index=1;
for(j=1;j<n;j++)
{
for(i=0;i<j;i++)
{
if(str[j][i]!=0)
index=0;
break;
}
}
return index;
}
指针
9-5 字符串的连接
本题要求实现一个函数,将两个字符串连接起来。
函数接口定义:
char *str_cat( char *s, char *t );
函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 10
char *str_cat( char *s, char *t );
int main()
{
char *p;
char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};
scanf("%s%s", str1, str2);
p = str_cat(str1, str2);
printf("%s\n%s\n", p, str1);
return 0;
}
输入样例:
abc
def
输出样例:
abcdef
abcdef
代码:
char *str_cat( char *s, char *t )
{
int i;
char *str=s;
for(i=0;*s;i++)
{str[i]=*s;
s++;}
for(;*t;i++)
{
str[i]=*t;
t++;
}
str[i]='\0';
return str;
}
9-11 计算职工工资
给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。
输入格式: 输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。
输出格式: 按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。
输入样例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
输出样例:
zhao 565.00
qian 430.00
zhou 630.00
代码:
#include <stdio.h>
struct staff
{
char name[10];
float basicmoney;
float wavemoney;
float afford;
float realmoney;
};
int main()
{int i=0,n;
struct staff date[1000];
scanf("%d",&n);
for(;i<n;i++)
{scanf("%s %f %f %f",date[i].name,&date[i].basicmoney,&date[i].wavemoney,&date[i].afford);}
for(i=0;i<n;i++)
{
date[i].realmoney =date[i].basicmoney+date[i].wavemoney-date[i].afford;
printf("%s %.2f\n",date[i].name,date[i].realmoney);
}
return 0;
}
|