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
分析:
-
浮点数输入用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;
}