C语言练习一

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;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sylphii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值