T1 表达式求值
表达式求值。
输入格式
只有一行,依次为整数a、操作符op、和整数b,a、op、b中间有一个空格分隔。其中-10000<a,b<10000,操作符op为“+”、“-”、“*”、“/”、和“%”之一。
输出格式
只有一行,为a、b两个数通过op的计算结果。比如,输入为“1 + 2”,则计算1和2的和并输出“1 + 2 = 3”。
注意:当操作符op为“/”或“%”,且b为0时,算式无效,此时,程序输出一个单词:Invalid。
代码
#include<stdio.h>
int main(){
int a,b;
char op;
scanf("%d %c %d",&a,&op,&b);
if(op=='+')
printf("%d %c %d = %d",a,op,b,a+b);
if(op=='-')
printf("%d %c %d = %d",a,op,b,a-b);
if(op=='*')
printf("%d %c %d = %d",a,op,b,a*b);
if(op=='/'){
if(b==0)
printf("Invalid");
else //商可能为小数,此处应有类型转换,但本题对此不作要求。
printf("%d %c %d = %d",a,op,b,a/b);
}
if(op=='%'){
if(b==0)
printf("Invalid");
else
printf("%d %c %d = %d",a,op,b,a%b);
}
return 0;
}
T2 一个月有几天
请写一段程序来计算某年某月的天数。
输入格式
为两个用空格分隔的正整数year和month,它们分别代表年份和月份。
输入保证合法,用int型存储即可。
输出格式
为year年month月的天数。
代码
#include<stdio.h>
int rYear(int x){ //C语言不能用bool
if(x%4!=0)
return 0;
else{
if(x%100!=0)
return 1;
else{
if(x%400!=0)
return 0;
else
return 1;
}
}
}
int main(){
int year,month;
scanf("%d %d",&year,&month);
if(month==2){
if(rYear(year)==1)
printf("29");
else
printf("28");
}
else{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
printf("31");
else
printf("30");
}
return 0;
}
T3 五个数求最大值
请写一段程序求5个数的最大值。
输入格式
只有一行,为用空格分隔的5个整数,这5个整数均大于-10000,小于10000。
输出格式
为这5个数的最大值。
代码
#include<stdio.h>
#include<math.h>
int main(){
int a,b,c,d,e,max;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
max=a;
if(max<b)
max=b;
if(max<c)
max=c;
if(max<d)
max=d;
if(max<e)
max=e;
printf("%d",max);
return 0;
}
T4 温度转换
摄氏温度(℃)和华氏温度(℉)之间的换算关系为:
华氏度=摄氏度×1.8+32 或 华氏度=摄氏度×9/5+32
摄氏度=(华氏度-32)÷1.8
现请你写一段摄氏温度与华氏温度转换的程序。
输入格式
只有一行,为一个浮点数f和一个字符c,两者之间由一个空格分隔。其中-10000<f<10000,c只可能是”C”或”F”。
输出格式
只有一行,如果输入的温度低于零下273.15摄氏度时,直接输出Invalid。否则输出该温度。要求,如果输入的是摄氏度则转换为华氏度,如果输入的为华氏度,转换为摄氏度。数值保留2位小数,同时在数值后输出温度单位(”C”或”F”)。
代码
#include<stdio.h>
int main(){
float f;
char c;
scanf("%f %c",&f,&c);
if(c=='C'){
if(f<-273.15)
printf("Invalid");
else{
f=f*1.8+32;
printf("%.2f F",f);
}
}
if(c=='F'){
f=(f-32)/1.8;
if(f<-273.15)
printf("Invalid");
else
printf("%.2f C",f);
}
return 0;
}
T5 浮点数判等
请写一段程序来判断表达式是否相等。
输入格式
只有一行,为三个用空格分隔的浮点数a,b,c(0<a,b,c<100)。
输出格式
也只有一行,如果 a - b 等于c ,则输出yes,否则输出no。
代码
#include<stdio.h>
int main(){
float a,b,c;
scanf("%f %f %f",&a,&b,&c);
if(a-b-c<0.000001&&a-b-c>-0.000001)
printf("yes");
else
printf("no");
return 0;
}
//赋值有误差,故不能直接用a-b==c。
T6 及格
某门课规定总成绩由两部分组成,即平时成绩和期末考试成绩,这两部分成绩的比例为a:b,假设a为3,b为7,则意味着在总成绩中平时成绩占30%,期末考试成绩占70%。现在请你写一段程序来计算一下,某位同学是否及格。
输入格式
为4个用空格分隔的整数,依次代表两种成绩所占比例a,b 以及平时成绩,期末考试成绩。注意:测试用例不保证a+b一定等于10。
输出格式
为两行,第一行为该同学的总成绩(保留1位小数),第二行,如果该同学总成绩及格(大于等于60),则输出pass,否则输出fail。测试用例保证合法,且整数可以用int存储,小数可以用float存储。
代码
#include<stdio.h>
int main(){
int a,b,sPingshi,sQimo;
float sZong;
scanf("%d %d %d %d",&a,&b,&sPingshi,&sQimo);
sZong=1.*a/(a+b)*sPingshi+1.*b/(a+b)*sQimo;
printf("%.1f\n",sZong);
if(sZong>=60)
printf("pass");
else
printf("fail");
return 0;
}
T7 正负数统计
请写一段正负数统计的程序。
输入格式
为若干整数,以-1结束(测试数据保证这组数中只有最后一个-1)。
输出格式
共两行,第一行为三个整数(用一个空格分隔),依次为这组数中正数的个数,0的个数和负数的个数(不统计最后的-1)。
第二行为用一个空格分隔的两个整数,依次为这组数中所有正数的和及所有负数的和(不包括最后的-1)。
测试数据保证求和的结果可以用int型存储。
代码
#include<stdio.h>
int main(){
int temp,nPositive=0,nZero=0,nNegative=0,sumPositive=0,sumNegative=0;
while(temp!=-1){
scanf("%d",&temp);
if(temp>0){
++nPositive;
sumPositive=sumPositive+temp;
}
if(temp==0)
++nZero;
if(temp<0){
++nNegative;
sumNegative=sumNegative+temp;
}
}
nNegative=nNegative-1;
sumNegative=sumNegative+1;
printf("%d %d %d\n",nPositive,nZero,nNegative);
printf("%d %d",sumPositive,sumNegative);
return 0;
}
T8 求最大值和最小值
请写一段程序求一个数列的最大值和最小值。
输入格式
为2行,第一行为整数n(1<n<200)。第二行为n个整数,这些整数均大于-10000且小于10000。
输出格式
只有一行,为用一个空格分隔的两个整数,依次为这n个整数中的最小值和最大值,中间用一个空格分隔。
代码
#include<stdio.h>
int main(){
int n,i=0,temp,max=-10000,min=10000;
scanf("%d\n",&n);
while(i!=n){
scanf("%d",&temp);
if(max<temp)
max=temp;
if(min>temp)
min=temp;
++i;
}
printf("%d %d",min,max);
return 0;
}
T9 解方程
写一程序,计算满足方程ax+by=c,(0<x,y<100)的所有整数解。
输入格式
三个整数a, b, c,(1<a,b,c<5000)。
输出格式
为满足方程ax+by=c,(0<x,y<100)的所有整数解。
要求:
1、每行输出一组解,x,y中间用一个空格分隔;
2、依次按x,y升序输出所有解。
测试数据保证至少有一组解。
代码
#include<stdio.h>
int main(){
int a,b,c,x,y;
scanf("%d %d %d",&a,&b,&c);
for(x=1;x<100;x++){
for(y=1;y<100;y++){
if(a*x+b*y==c)
printf("%d %d\n",x,y);
}
}
return 0;
}
T10 求素数
请写一段程序计算两个数之间的素数。
输入格式
为两个正整数a和b,(1<a,b<1000)。
输出格式
当a小于b时,计算开区间(a,b)中的所有素数,并按升序输出,当a>=b时,或该区间没有素数则输出error。
注意:输出的素数之间用一个空格分隔,最后一个素数后面没有空格。
代码
#include<stdio.h>
int PrimeNumber[1000];
int main(){
int a,b,n,i,x,y=0,temp=0;
scanf("%d %d",&a,&b);
if(a>=b)
printf("error");
else{
for(n=a+1;n<b;n++){
for(i=2;i<n;i++){
x=1;
if(n%i==0){
x=0;
break;
}
}
if(x==1){
PrimeNumber[++temp]=n;
y=1;
}
}
if(y==0)
printf("error");
else{
for(i=1;i<temp;i++)
printf("%d ",PrimeNumber[i]);
printf("%d",PrimeNumber[i]);
}
}
return 0;
}
T11 正整数逆序
写一段程序将一个正整数逆序输出。
输入格式
为一个正整数,该正整数小于2的31次方。
输出格式
将该数的各位数字逆序输出(输入的数字末尾为0时也输出)。
代码
#include<stdio.h>
#include<string.h>
char A[1000];
int main(){
int i,n;
scanf("%s",A);
n=strlen(A);
for(i=n-1;i>=0;i--)
printf("%c",A[i]);
return 0;
}
T12 简单字符处理
简单字符处理,不允许使用数组。
输入格式
为一个以换行符”\n”结尾的字符串,字符串长度大于0且小于200。
输出格式
第一行为将该字符串中的小写字母替换为大写字母后的字符串。
第二行为一个整数,为该字符串中所有元音字母的个数。
代码
#include<stdio.h>
int main(){
char x;
int y=0;
scanf("%c",&x);
while(x!='\n'){
if('a'<=x&&x<='z')
x=x-32;
if(x=='a'||x=='e'||x=='i'||x=='o'||x=='u'||x=='A'||x=='E'||x=='I'||x=='O'||x=='U')
y++;
printf("%c",x);
scanf("%c",&x);
}
printf("\n%d",y);
return 0;
}
T13 罚时计算
众所周知OJ的排名跟罚时有关,那么罚时怎么计算呢?计算罚时有三条规则,一只有过了的题才计算罚时(没通过的题罚时为0);二、每题的罚时由两部分组成,一部分为考试开始到该题解题的时间(分钟数),另一部分为错误的提交次数乘以20分钟;三、总罚时为所有题目罚时的总和。现请你写一段程序来计算罚时。
输入格式
第一行为一个整数n(0<n) ,代表本次考试的题目总数,后边n行每行代表均为三个用空格分隔的整数,分别代表这n道题的答题情况。这三个整数依次代表该题该题的结果(1代表通过,0代表未通过),通过的时间(未通过的为最后一次提交的时间),提交的次数。
输出格式
为一个整数,代表总罚时。测试用例保证合法且所有整数可以用int存储。
代码
#include<stdio.h>
int main(){
int n,pass,time,submit,penalty,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d %d",&pass,&time,&submit);
if(pass==1)
penalty=time+20*(submit-1);
else
penalty=0;
sum=sum+penalty;
}
printf("%d",sum);
return 0;
}
T14 求和
请写程序计算数列中所有除以3余1且除以5余2的数的和。
输入格式
第一行为一个整数n(0<n),代表n组测试用例。后边是n行,每行代表一组测试用例。每行中包含若干整数,以-1结束。测试用例保证每行只有最后一个数为-1,其他数均为正整数。
输出格式
为n行,每行一个整数,对应n组测试用例,为求和的结果。测试用例保证合法且所有整数可以用int存储。
代码
#include<stdio.h>
int SUM[100];
int main(){
int n,N=0,num,sum=0;
scanf("%d",&n);
while(N!=n){
scanf("%d",&num);
if(num%3==1&&num%5==2)
sum=sum+num;
while(num!=-1){
scanf("%d",&num);
if(num%3==1&&num%5==2)
sum=sum+num;
}
N++;
SUM[N]=sum;
sum=0;
}
for(int i=1;i<=n;i++)
printf("%d\n",SUM[i]);
return 0;
}
T15 打印图形二
用'*'(星号)和'.'(点)空格打印如下图案。
输入格式
只有一行为用空格分隔的三个整数,依次为l,c和n(0<l,c,n<20)。其中l和c分别代表格子的行数和列数;n代表格子内点的列数(格子内点的行数固定为3)。具体见输出样例。
输出格式
根据给定的行列等参数输出图形(请看输出样例)。
代码
#include<stdio.h>
int main(){
int l,c,n,numC,numL,i,j,k,m;
scanf("%d %d %d",&l,&c,&n);
numC=c+1+c*n;//小列数目
numL=4*l;//小行数目(不包括第一小行)
//打印第一小行
i=0;
while(i!=numC){
printf("*");
i++;
}
printf("\n");
m=0;
//打印第一小行以下内容
while(m!=l){
j=0;
//打印一行"*..*..*..*"
while(j!=numL/l-1){
k=0;
//打印"*.."
while(k!=c){
printf("*");
i=0;
while(i!=n){
printf(".");
i++;
}
k++;
}
printf("*\n");//打印每小行末尾的"*"
j++;
}
//打印每行封底的"***"
i=0;
while(i!=numC){
printf("*");
i++;
}
printf("\n");
m++;
}
return 0;
}
T16 十七进制转十进制
请写一段程序将十七进制数转换为十进制。
输入格式
为一个只包含小写字母的字符串(其中a代表十七进制的0,b代表十七进制的1,以此类推直到q代表十七进制的16),字符串以’\n’结束。
输出格式
是一个整数,转换后的十进制数。测试用例保证合法,且转换后的整数可以用int存储。
代码
#include<stdio.h>
#include<math.h>
char hexadecimal[100];
int main(){
int i=0,j,k=1,decimal=0,temp;
hexadecimal[0]='A';
//由字符串得到对应十七进制数并按位存至hexadecimal
while(hexadecimal[i]!='\n'){
i++;
scanf("%c",&hexadecimal[i]);
}
//将十七进制数转换为十进制数并存至decimal
for(j=i-1;j>=1;j--){
temp=(hexadecimal[j]-97)*pow(17,k-1);
decimal=decimal+temp;
k++;
}
printf("%d",decimal);
return 0;
}
T16改 十七进制转二进制
代码
#include<stdio.h>
#include<math.h>
char hexadecimal[100];
int binary[100];
int main(){
int i=0,j,k=1,decimal=0,remainder,temp;
hexadecimal[0]='A';
//由字符串得到对应十七进制数并按位存至hexadecimal
while(hexadecimal[i]!='\n'){
i++;
scanf("%c",&hexadecimal[i]);
}
//将十七进制数转换为十进制数并存至decimal
for(j=i-1;j>=1;j--){
temp=(hexadecimal[j]-97)*pow(17,k-1);
decimal=decimal+temp;
k++;
}
i=100;
//连除法得到二进制数,并按位存至binary
while(decimal>1){
remainder=decimal%2;
decimal=(decimal-remainder)/2;
binary[i]=remainder;
i--;
}
binary[i]=decimal;
//打印出二进制数
for(j=i;j<=100;j++)
printf("%d",binary[j]);
return 0;
}
T17 三角形
有一根绳子的长度为n(3<=n<1000且为整数),将该绳子分成三段,每段的长度为正整数,请计算由这三段绳子组成的三角形个数。
输入格式
只有一个整数代表n,测试用例保证合法。
输出格式
只有一个整数,为能组成的三角形的个数。
代码
#include<stdio.h>
int main(){
int n,a,b,c,N=0;
scanf("%d",&n);
for(a=1;a<=n-2;a++){
for(b=a;b<=n-a-1;b++){
c=n-a-b;
if(c>=b&&a+b>c&&b+c>a&&c+a>b)
N++;
}
}
printf("%d",N);
}
T18 习题课一
某程要开习题课,由于教室座位有限,所以决定限制参加人数。于是规定:1、最多允许一半的班级里的同学参加;2、可以参加的班级最多允许一半的同学参加。现请你写一段程序来计算习题课最多可能有多少个学生参加。
输入格式
为两行,第一行为一个整数n(0<n<100),代表班级的个数,第二行为n个正整数,分别代表每个班级的人数。
输出格式
只有一行,为能够参加习题课的人数的最大值。(当数字为奇数时,一半指的是该数减一后除以2,测试用例保证所有整数可以用 int 类型存储)。
代码
#include<stdio.h>
int Pop[100];
int main(){
int n,k,max,student=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&Pop[i]);
for(int i=1;i<=n/2;i++){
max=Pop[1];
k=1;
for(int i=2;i<=n;i++){
if(Pop[i]>max){
max=Pop[i];
k=i;
}
}
student=student+max/2;
Pop[k]=0;
}
printf("%d",student);
return 0;
}