几道基础C语言题

1.递归求阶乘

分析n!=1*2*...*n
那么我们有两种方法

  • 递归
    思路:根据阶乘的规律n!=n*(n-1)!
    定义函数f(x),使函数返回x*f(x-1)的值,直到n=1。经过函数调用本身求出结果。
    代码

      #include<stdio.h>
      int cnt(int n);//调用声明函数
      int main()
      {
      	int n;
      	scanf("%d",&n);
      	printf("%d",cnt(n));
      	return 0;
      }
    
      int cnt(int n)//定义声明函数
      {
      	if(n>0)
      	n*=cnt(n-1);
      	else n=1;
      	return n;
      }
    
  • 循环
    思路:由于n!=n*(n-1)*...*1,则从a=1开始,+1之后与a相乘。
    代码

      #include<stdio.h>
      int main()
      {
      	int n;
      	scanf("%d",&n);
      	int a=1;	//a要初始化为1 
      	for(int i=1;i<=n;i++) //注意i应从1取到n,因此判断条件为<=
      	a=a*i;
      	printf("%d",a);
      	return 0;
      }
    

2.分制转换

题目:给出一个百分制成绩,要求输出成绩等级‘A’(90分及90分以上),‘B’(80到89分),’C’(70到79分),’D’(60到69分),’E’(60分以下)。
输入格式
百分制成绩,整数,例如,100,89
输出格式
等级制成绩,例如A,B,C等等
eg85 B
分析:这道题很简单,在我复习重写的时候发现比以前写的简洁了不少,因为用到了映射的思想,使分数由5类简化为三类:100分,60到99分,60分以下。
代码

#include<stdio.h>
int main()
{
	int s;
	scanf("%d",&s);
	s/=10;//成绩映射为0-10 
	if(s==10)//10(满分)的情况 
	printf("A");
	else if(s>=6)//将6到9转换为字母等级 
	printf("%c",('E'-s+5));
	else printf("E");//小于6(不及格)的情况
	return 0;
}

3.判断是否为素数(<1000)

分析:素数为只能被1和自己整除的数,因此我们可以通过循环,从2开始遍历比数小的所有数。
优化
2的倍数非素数,因此先判断是否为2的倍数。
判断某个数是否为因数时,可以一起决定多个数是否为因数。
比如判断11是否为素数,要从2到9判断,而2非因数,同时可以确定6到10也非因数,因为2乘这些数大于11,因此不可能有比2大的数与6到10相乘得11.
代码

#include<stdio.h>
int main()
{
	int n;
	int r=1; //用r记录是否为素数。1为素数0非素数 
	scanf("%d",&n);
	//大于2的偶数非素数
	if((n/2>1)&&(n%2==0)) 
	r=0;
	//判断是否为素数
	for(int i=3;r==1&&i*i<=n;i+=2) //更新直接+2,因到只用判断奇数
	{
		if(n%i==0) 
		{
			r=0;
			break; //跳出for循环
		}
	}
	//通过r的值(是否为素数)进行输出
	if(r==0)
	printf("NO");
	else
	printf("YES");
	return 0;
}

4.今天是第几天

题目:输入三个整数为年月日 ,输出是那一年的第几天
eg:输入:1990 9 20 输出:263

#include<stdio.h>
int main()
{
	int y,m,d;
	scanf("%d%d%d",&y,&m,&d);
	int r=d; //结果初始化为天数d
	for(int i=1;i<m;i++)//逐月增加天数:从1月加到m-1月 
	{
		switch(i) 
		{
			case 2:
			r+=28;
			break;
			case 4:
			case 6:
			case 9:
			case 11:
			r+=30;
			break;
			default://31天的月份较多放在default中 
			r+=31;			
		}
	}
	//判断平年闰年,若为闰年2月有29天,再加1
	if((y%400==0)||((y%4==0)&&(y%100!=0))) 
	r++;
	printf("%d",r);
	return 0;
}

5.按要求输出

题目:写一程序,输入为三行,第一行为整数a、第二行为字符c、第三行为整数b。(0<a,b<100000)。
输出共四行。第一行依次输出a,b,c,三个值之间用一个空格分隔;第二依次输出a+b,a-b,a* b,a/b,a%b的值,每个值之间用一个空格分隔;第三行输出a和b的比率(浮点数,精确到小数点后两位);第四行输出a和b的百分比率(浮点数,精确到小数点后两位)。具体格式见输出样例。
输入样例
12
b
234
输出样例
12 234 b
246 -222 2808 0 12
The ratio of 12 versus 234 is 0.05.
The ratio of 12 / 234 is 5.13%.
代码

#include<stdio.h>
 int main()
 {
	//输出控制字符:加\;输出%:%% 
	long long a,b; //整型出现乘法:用lld
	char c;
	scanf("%lld",&a);
	scanf("\n%c",&c);
//scanf:1.按格式要求。2.输入非c时自动忽略前导空白符号,不用加\n。
//3.输入为c时会读入空白符号->如何解决上一行的换行符残留:加\n或用getchar 
	scanf("%lld",&b);
	printf("%lld %lld %c\n",a,b,c);
	printf("%lld %lld %lld %lld %lld\n",a+b,a-b,a*b,a/b,a%b);
	printf("The ratio of %lld versus %lld is %.2lf.\n",a,b,(double)a/b);
	printf("The ratio of %lld / %lld is %.2lf%%.",a,b,100*(double)a/b);
	return 0;
 }

6.按要求输出

题目:一程序,输入依次为一个整数a、一个浮点数f、一个整数b。(-10000<a,b,f<10000)。
输出共五行。第一行依次输出a,f,b,每个数占位10个字符位,右对齐。任意两个数之间不添加空格,f精确到小数点后一位;第二行依次输出a,f,b,每个数占位10个字符位,带正负号,左对齐,f精确到小数点后两位。任意两个数之间不添加空格。末尾输出字符串Hello;第三行输出35个#;第四行依次输出a,f,b,每个数占位10个字符位,包含正负号,右对齐,f精确到小数点后两位,任意两个数之间不添加空格;第五行连续输出三组0123456789。
输入样例
12 34.567 89
输出样例
12 34.6 89
+12 +34.57 +89 Hello
###################################
+12 +34.57 +89
012345678901234567890123456789
代码

#include<stdio.h>
int main()
{
	int a,b;
	double f;
	scanf("%d %lf %d",&a,&f,&b); //double类型输入用lf
	//+为整数时显示+;-左对齐(默认右对齐);
	//%a.bf保留小数点后b位,所占长度至少为a
	printf("%10d%10.1lf%10d\n",a,f,b);
	printf("%-+10d%-+10.2lf%-+10dHello\n",a,f,b);
	printf("###################################\n");
	printf("%+10d%+10.2lf%+10d\n",a,f,b);
	for(int i=0;i<3;i++)
	printf("0123456789");
	return 0;
}

7.温度转换

代码

#include<stdio.h>
//宏定义提高代码可读性 
#define bei 1.8 
#define cha 32
#define low -273.15
int main()
{
	double num;
	char c;
	scanf("%lf %c",&num,&c);
	if(c=='C'&&num>=low)
	printf("%.2lf F",num*bei+cha);
	else if(c=='F'&&(num-cha)/bei>=low)
	//计算转化后的是否满足高于绝对零度 
	printf("%.2lf C",(num-cha)/bei);
	else
	printf("invalid");
	return 0;
}

8.浮点数比较

题目
输入只有一行,为三个用空格分隔的浮点数a,b,c(0<a,b,c<100)
输出也只有一行,如果 a - b 等于c ,则输出yes,否则输出no。
输入样例
3.4 2.2 1.3
输出样例
no
分析

  1. 浮点数输入用double,防止数据过大
    2.浮点数比较使用fabs:
    相等:fabs(m-n)<=1E-6
    不等: fabs(m-n)>1E-6
    比较大小:(要满足大小关系且不相等)m>n&&fabs(m-n)>1E-6 或 m-n>1E-6
    原理:转化为2进制储存,只有可表示为2的幂与整数数乘的浮点数可准确表示,
    其余的数都是近似值
    代码

     #include<stdio.h>
     #include<math.h>//fabs函数需要引入数学库
     int main()
     {
     	double a,b,c;
     	scanf("%lf %lf %lf",&a,&b,&c);
     	if(fabs(a-b-c)<1E-6)
     	printf("yes");
     	else printf("no");
     	return 0;
      } 
    

9.交党费

题目:每月工资收入(税后)在3000元以下(含3000元)者,交纳月工资收入的0.5%;3000元以上至5000元(含5000元)者,交纳1%;5000元以上至10000元(含10000元)者,交纳1.5%;10000元以上者,交纳2%。
现请你写一段程序来计算一下某在职教师党员某月应交党费额。
输入格式
只有一行,为一个浮点数salary(0<salary<20000),为该教师该月的收入(税后)。
输出格式
只有一行,为该教师该月应交党费金额(保留1位小数)。
输入样例
3000
输出样例
15.0
代码

#include<stdio.h>
#include<math.h>
int main()
{
	const double rate[4]={0.005,0.01,0.015,0.02};
	//党费比例写在数组中,代码可读性高 
	double s,d;
	scanf("%lf",&s);
	if(s<3000||fabs(s-3000)<=1E-6)//小于等于一个浮点数的判断方法 
	d=rate[0]*s;
	else if(s<5000||fabs(s-5000)<=1E-6)
	d=rate[1]*s;
	else if(s<10000||fabs(s-10000)<=1E-6)
	d=rate[2]*s;
	else
	d=rate[3]*s;
	printf("%.1lf",d);
	return 0;
}

10.未完待续。。。

猜你喜欢

转载自www.cnblogs.com/shanestella/p/12700963.html