第二章
practice
2-3 暴力输出倒三角
#include <stdio.h>
int main()
{
printf("* * * *\n * * *\n * *\n *");
return 0;
}
2-6 计算物体自由下落的距离
#include <stdio.h>
int main()
{
double height,g,time;
time = 3;
g=10;
height = 0.5*g*time*time;
printf("height = %.2f",height);//保留两位小数
return 0;
}
2-8 华氏摄氏温度转换
#include <stdio.h>
int main()
{
int fahr,celsius;
scanf("%d",&fahr);
celsius = 5*(fahr-32)/9;
printf("Celsius = %d",celsius);
return 0;
}
2-10 计算分段函数【1】
#include <stdio.h>
int main()
{
double x;
double y;
scanf("%lf", &x);
if(x != 0)
{
y = 1/x;
}
else
{
y = 0;
}
printf("f(%.1f) = %.1f", x, y);
return 0;
}
2-11 计算分段函数【2】
#include <stdio.h>
#include <math.h>
int main()
{
double x,y;
scanf("%lf",&x);
if(x<0)
{
y = pow(x+1,2) + 2*x + 1/x;
}
else
{
y = sqrt(x);
}
printf("f(%.2f) = %.2f",x,y);
return 0;
}
##本题需要使用math库
2-12 输出华氏摄氏温度转换表
#include <stdio.h>
int main()
{
int fahr,lower,upper;
double celsius;
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
if(lower<=upper)//验证合法性
{
printf("fahr celsius\n");
for(fahr=lower;fahr<=upper;fahr+=2)
{
celsius = 5*(fahr-32)/9.0;
printf("%4d%6.1f\n",fahr,celsius);
}
}
else
{
printf("Invalid Value!\n");
}
return 0;
}
2-13 求前N项和【1】
#include <stdio.h>
int main() {
int N;
scanf("%d",&N);
double sum=0;
for(int i=1;i<=N;i++)
sum+=1.0/i;
printf("sum = %.6lf",sum);
return 0;
}
2-14 求前N项和【2】
#include <stdio.h>
int main()
{
int N,denominator=1;
double sum = 0,item=1;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
item = 1.0/denominator;
sum+=item;
denominator+=2;
}
printf("sum = %.6f",sum);
return 0;
}
2-15 求前N项和【3】
#include <stdio.h>
int main()
{
int i,N,flag,denominator;
double sum,item;
flag = 1;
denominator = 1;
item = 0;
sum = 0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
item = 1.0*flag/denominator;
sum += item;
flag = -flag;
denominator += 3;
}
printf("sum = %.3f",sum);
return 0;
}
exercise
2-1 求整数均值
#include <stdio.h>
int main()
{
int m, n, p, q, Sum;
double Average;
scanf("%d %d %d %d",&m,&n,&p,&q);
Sum = m+n+p+q;
Average = Sum/4.0;//可以直接放在printf里面少写两行代码
printf("Sum = %d; Average = %.1f",Sum , Average);
return 0;
}
2-2 阶梯电价
#include <stdio.h>
int main()
{
int n;
double cost;
scanf("%d",&n);
if(n<0)
{
printf("Invalid Value!\n");
return 0;//这条语句很关键 ,可以结束上面的判断
}
/*else if(n<=50)
cost = 0.53*n;
else
cost = (n-50)*(0.53+0.05)+0.53*50;*/
else if(n>50)
{
cost = (n-50)*(0.53+0.05)+0.53*50;
}
else//把可能会重合的判断条件放到最后 ,试过了不行。
{
cost = 0.53*n;
}
printf("cost = %.2f\n",cost);
return 0;
}
2-3 序列求和
#include <stdio.h>
int main()
{
int m,n;
double sum=0;
scanf("%d %d",&m,&n);
for(int i=m;i<=n;i++)//for循环的i最好还是在括号里面初始化
{
//temp = i*i + 1.0/i;
sum += i*i + 1.0/i;
}
printf("sum = %.6f\n",sum);
return 0;
}
2-4 求交错级数前n项和
#include <stdio.h>
int main()
{
int N,flag=1;
double sum=0;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
sum += 1.0*i*flag/(2*i-1);//乘号不要忘记了
flag = -flag;
}
printf("%.3f",sum);
return 0;
}
2-5 平方根求和
#include <stdio.h>
#include <math.h>
int main()
{
int N;
double sum = 0;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
sum += sqrt(i);
}
printf("sum = %.2f",sum);
return 0;
}
2-6 求给定序列前n项和
#include <stdio.h>
double fact(int N);//这里不要忘记了;
int main()
{
int N;
scanf("%d",&N);
double sum =0;
for(int i=1; i<=N ;i++)
{
sum += fact(i);
}
printf("%0.f",sum);
return 0;
}
double fact(int N)
{
double product=1;
for(int i=1; i<=N;i++)
{
product *= i;
}
return product;
}
第三章
pratice
3-2 计算符号函数的值
#include <stdio.h>
int main()
{
int n,y;
scanf("%d",&n);
if(n<0)
{
y = -1;
}
else if(n==0)
{
y = 0;
}
else
{
y = 1;
}
printf("sign(%d) = %d",n,y);
return 0;
}
3-3 统计学生平均成绩与及格人数
#include <stdio.h>
int main()
{
int N, count = 0;
double score,total = 0;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%lf",&score);
total += score;
if(score>=60)
count ++;
}
if(N!= 0)
printf("average = %.1f\ncount = %d",total/N,count);
else
printf("average = %.1f\ncount = %d",0.0,0);
return 0;
}
3-4 统计字符
#include <stdio.h>
int main()
{
int letter,blank,digit,other;
letter = blank = digit = other = 0;
char ch;
for(int i=1;i<=10;i++)
{
ch = getchar();
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//打的时候注意,看清>与<
{
letter++;
}
else if(ch>='0'&&ch<='9')
{
digit++;
}
else if(ch==' '||ch=='\n')
{
blank++;
}
else
other++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
3-5 输出闰年
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int flag = 0;//给个标志位说明闰年是否存在
if(n>2000 && n<=2100)//没有突出21世纪,已改正
{
for(int i=2001 ; i<=n ; i++)//PAT不要2000这个数字
{
if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
{
flag = 1;
printf("%d\n",i);
}
}
if(flag == 0)//不要放进for循环 ,慢慢品之间的逻辑关系 ,题目给的是不存在任何闰年再判none
{
printf("None");
}
}
else
{
printf("Invalid year!");
}
return 0;
}
3-7 将百分制成绩转换成五分制成绩
#include <stdio.h>
int main()
{
int score;
scanf("%d",&score);
if(score>=90)
printf("A");
else if(score>=80 && score<90)
printf("B");
else if(score>=70 && score<80)
printf("C");
else if(score>=60 && score<70)
printf("D");
else
printf("E");
return 0;
}
3-8 查询水果的单价
#include <stdio.h>
int main()
{
int n;
double price;
printf("[1] apple\n");
printf("[2] pear\n");
printf("[3] orange\n");
printf("[4] grape\n");
printf("[0] exit\n");
for(int i=1;i<=5;i++)
{
scanf("%d",&n);
if(n==0)
break;
switch(n)
{
case 1:
printf("price = 3.00\n");
break;
case 2:
printf("price = 2.50\n");
break;
case 3:
printf("price = 4.10\n");
break;
case 4:
printf("price = 10.20\n");
break;
default:
printf("price = 0.00\n");
break;
}
}
return 0;
}
exercise
3-1 比较3个整数的大小
#include <stdio.h>
int main()
{
int a,b,c;
int temp1,temp2,temp3;
temp1=temp2=temp3=0;
scanf("%d %d %d",&a,&b,&c);
if(a>b)//暴力内嵌解题
{
if(a>c)
{
if(b>c)
{
temp1 = a;
temp2 = b;
temp3 = c;
}
else
{
temp1 = a;
temp2 = c;
temp3 = b;
}
}
else
{
temp1 = c;
temp2 = a;
temp3 = b;
}
}
else
{
if(a>c)
{
temp1 = b;
temp2 = a;
temp3 = c;
}
else
{
if(b>c)
{
temp1 = b;
temp2 = c;
temp3 = a;
}
else
{
temp1 = c;
temp2 = b;
temp3 = a;
}
}
}
printf("%d->%d->%d",temp3,temp2,temp1);
return 0;
}
3-2 高速公路超速罚款
#include <stdio.h>
int main()
{
int carspeed,limspeed;
double x;
scanf("%d %d",&carspeed,&limspeed);
x = (carspeed - limspeed)*100.0/limspeed;
if(x>=10 && x<50)
printf("Exceed %.0f%%. Ticket 200",x);//打两个%%才能输出一个%
else if(x>=50)
printf("Exceed %.0f%%. License Revoked",x);
else
printf("OK");
return 0;
}
3-3 出租车计价
#include <stdio.h>
int main()
{
double mile,mprice,tprice;
int time;
mprice = 0;
tprice = 0;
scanf("%lf %d",&mile,&time);//输出不要限制格式为%.1lf,不然程序无法正常运行
if(mile<=3)//写分支时一定要注意
mprice = 10;
else if(mile<=10)
mprice = 10 + (mile - 3)*2;
else
mprice = 10 +(10 - 3)*2 + (mile - 10)*3;
if(time>=5)
tprice = (time*2)/5;//注意超过五分钟收费包括前面的五分钟
else
tprice = 0;
printf("%.0f",mprice+tprice);
return 0;
}
3-4 统计学生成绩
#include <stdio.h>
int main()
{
int N,score;
int countA,countB,countC,countD,countE;
countA=countB=countC=countD=countE=0;
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%d",&score);
if(score<60)
countE++;
else if(score<70)
countD++;
else if(score<80)
countC++;
else if(score<90)
countB++;
else
countA++;
}
printf("%d %d %d %d %d",countA,countB,countC,countD,countE);
return 0;
}
3-5 三角形判断
#include <stdio.h>
#include <math.h>
int main()
{
double x1,y1,x2,y2,x3,y3;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);//注意输入的格式要求
double L=0,s=0,A=0,L1=0,L2=0,L3=0;
L1 = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
L2 = sqrt(pow(x1-x3,2)+pow(y1-y3,2));
L3 = sqrt(pow(x2-x3,2)+pow(y2-y3,2));
if(L1+L2>L3 && L1+L3>L2 && L2+L3>L1)
{
L = L1+L2+L3;
s = (L1+L2+L3)/2;//注意公式不要用错了
A = sqrt(s*(s-L1)*(s-L2)*(s-L3));
printf("L = %.2f, A = %.2f",L,A);
}
else
printf("Impossible");
return 0;
}
第四章
pratice
4-3 序列求和
#include <stdio.h>
#include <math.h>
int main()
{
int flag = 1,denominator = 1;
double eps,item=1,sum=0;
scanf("%lf",&eps);
while(fabs(item)>eps)
{
sum += item;
flag = -flag;
denominator += 3;
item = flag*1.0/denominator;
}
sum += item;
printf("sum = %.6f",sum);
return 0;
}
4-6 猜数字游戏
#include <stdio.h>
int main()
{
int mynumber,yournumber,N;
int flag = 0, count = 0;
scanf("%d %d",&mynumber,&N);
while(count<N)
{
scanf("%d",&yournumber);//这里不要加换行符号
if(yournumber < 0)
{
break;
}
count++;
if(yournumber == mynumber)
{
if(count == 1)
{
printf("Bingo!\n");
}
else if(count <= 3)
{
printf("Lucky You!");
}
else
{
printf("Good Guess!");
}
flag = 1;
break;
}
else if(yournumber > mynumber)
{
printf("Too big\n");
}
else
{
printf("Too small\n");
}
}
if(flag == 0)
{
printf("Game Over\n");
}
return 0;
}
4-7 求e的展开式的和
#include <stdio.h>
int main()
{
int n;
double item, sum=1;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
item = 1;
for(int j=1 ; j<=i ;j++)
{
item*=j;
}
sum += 1/item;
}
printf("%.8f",sum);
}
4-10 找出最小值
#include <stdio.h>
int main()
{
int n,item,min;
scanf("%d",&n);
scanf("%d",&item);
min = item;
for(int i=1;i<n;i++)
{
scanf("%d",&item);
if(item<min)
min = item;
}
printf("min = %d",min);
return 0;
}
4-11 统计素数并求和
#include <stdio.h>
#include <math.h>
int main()
{
int M,N,flag;
int count=0,sum=0,limit;
scanf("%d%d",&M,&N);
if(M<1 || M>N || N>500)
{
printf("Invalid.");
}
//if(M>=1 && M<=N && N<=500)
else{
for(int i=M;i<=N;i++)
{
if(i==1)
{
flag=0;
}
else if(i==2)
{
flag=1;
}
else
{
flag=1;
limit =sqrt(N)+1;
for(int j=2;j<=limit;j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
}
if(flag == 1)
{
count++;
sum+=i;
}
}
}
printf("%d %d",count,sum);
return 0;
}
exercise
4-1 求奇数和
#include <stdio.h>
int main()
{
int n,sum = 0;
scanf("%d",&n);
while(n>0)
{
if(n%2!=0)
{
sum+=n;
}
scanf("%d",&n);//注意scanf放在后面
}
printf("%d",sum);
return 0;
}
4-2 展开式求和
#include <stdio.h>
#include <math.h>
double fact(int n);
int main()
{
int k;
double x,sum=1,item;
scanf("%lf",&x);
item =x;
k=1;//把k拿出来就可以跑了
while(fabs(item)>= 0.0001)
{
item = pow(x,k)/fact(k);
sum += item;
k++;
}
printf("%.4f",sum);
return 0;
}
double fact(int n)
{
double product=1;
for(int i=1;i<=n;i++)
{
product*=i;
}
return product;
}
4-3 求序列和2/1+3/2+5/3+8/5...
#include <stdio.h>
int main()
{
int N;
double f=2,d=1,t;
double sum = 2, item;
scanf("%d",&N);
for(int i = 1; i<N ; i++)
{
t = f;//一定要有中间变量t,不然值会被覆盖
f = f+d;
d = t;
item = f/d;
sum += item;
}
printf("%.2f",sum);
return 0;
}
4-4 求序列和a+aa+aaa+aaa...
#include <stdio.h>
//#include <math.h>
int main()
{
int a,n;
int s = 0, item = 0;
scanf("%d %d",&a,&n);//知道问题了,因为输入a在定义之后所以报错
for(int i = 1; i <= n ; i++)
{
item = item*10 + a;
s += item;
}
printf("s = %d",s);
return 0;
}
4-5 换硬币
#include <stdio.h>
int main()
{
int x,n1,n2,n5;
int count = 0;
scanf("%d",&x);
for(n5 = (x-3)/5; n5>0; n5--)
{
for(n2 = (x-5*n5-1)/2; n2>0; n2--)
{
n1 = x-5*n5-2*n2;
if(n1 > 0)
{
count ++;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",n5,n2,n1,n1+n2+n5);
}
}
}
printf("count = %d",count);
return 0;
}
4-6 输出水仙花数
#include <stdio.h>
#include <math.h>
/*int ipow (int x, int n)
{
int i, p = 1;
for (i = 1; i <= n; i++)
{
p = p * x;
}
return p;
}*/
int main (void)
{
int a, b, digit, i, n, number, s;
scanf ("%d", &n);
a = pow (10, n-1);//N位数的最大值与最小值
//b = a*10;
b = pow(10, n);
for (i = a; i < b; i++)//从a到b依次遍历各个数
{
s = 0;//s代表最后相加的总数
number = i;//代表把要检测的值赋给
while (number != 0)//对number进行逐位分离,分到最高位了,number就等于0了,循环跳出
{ //也可以把循环条件写成number>0
digit = number % 10;
number = number / 10;
s = s + pow (digit, n);
}
if (i == s)//判断各位N方和是否与该数相等,如果相等即为水仙花数,将其输出
{
printf ("%d\n", s);
}
}
return 0;
}
4-7 求最大公约数和最小公倍数
#include <stdio.h>
int main()
{
int m,n,j;
scanf("%d %d",&m,&n);
j=m;
while(j%n!=0)
{
j=j+m;
}
printf("%d %d",(m*n)/j,j);
return 0;
}
4-8 高空坠球
#include <stdio.h>
int main()
{
int height,n;
double s1,s2,sum;
scanf("%d %d",&height,&n);
//s1=height;
s1 = height;
s2 = 0.5*height;
if(n==0||height==0)
{
printf("0.0 0.0");
}
else
{
for(int i=1; i<=n; i++)
{
/*s2+= 2*s1;
s1 = 0.5*s1;
sum = s2-height;//使用两个变量就够了,给s1的初始值赋为0.5height
}*/
s1+= 2*s2;
s2 = 0.5*s2;//交换了上面s1,s2的含义,在赋初始值的时候变化
}
printf("%.1f %.1f",s1,s2);
}
return 0;
}
4-9 打印菱形星号“*”图案
#include <stdio.h>
//要求*带空格
int main()
{
int i,j,n;//这里n为奇数
scanf("%d",&n);
for(i=1; i<=n/2+1; i++)//控制每一行 ,n/2+1为最中间的行 ,先打印上半部分
{
for(j=n/2+1-i; j>0; j--)//先打印空格,再打印*
{
printf(" ");//如果这里是两个空格,上面j的初始值就不用*2
}
for(j=1; j<=2*i-1; j++)//上半部分行数与*的关系
{
printf("* ");
}
printf("\n");
}
for(i=1; i<=n/2; i++)//打印下半部分 ,这里为n/2,因为会取整
{
for(j=1; j<=i; j++)//n为固定值,循环的变量是找到与i的关系
{
printf(" ");//这里依旧为两个空格
}
for(j=n-2*i; j>0; j--)
{
printf("* ");
}
printf("\n");
}
return 0;
}
评注:这里使用的是矩阵按行打印的思想,将菱形分为上下两部分分别实现,外循环控制行,内循环依次打印空格和星号,用循环的次数控制空格数与星号数。找到空格数与星号数与行的关系is the key point!
4-10 猴子吃桃问题
//n为偶数
#include <stdio.h>
int main()
{
int n,sum;
scanf("%d",&n);
sum = 1;
for(int i=n; i>1; i--)//只需要计算n-1次
{
sum = 2*(sum+1);
}
printf("%d",sum);
return 0;
}
评注:这里的一个大前提是N为偶数,key point为找到桃子总数的递推关系即sum=2*(sum+1),注意这里只用循环n-1次,因为第n-1次的循环通过递推式子就已经得到第N次的结果。
4-11 兔子繁殖问题
分析
Month | 1 | 2 | 3 | 4 | 5 | 6 |
满1月兔对数n1 | 1 | 0 | 1 | 1 | 2 | 3 |
满2月兔对数n1 | 0 | 1 | 0 | 1 | 1 | 2 |
满3月及以上兔对数n3 | 0 | 0 | 1 | 1 | 2 | 3 |
sum | 1 | 1 | 2 | 3 | 5 | 8 |
注:兔子要满三个月再生产,而不是在第三个月就生产!!!
#include <stdio.h>
int main()
{
int n,n1,n2,n3,month;
scanf("%d",&n);
n1 = 1;
n2 = 0;
n3 = 0;
month = 1;//注意这里起始条件为1月
while(n1+n2+n3<n)
{
n3 = n3 + n2;
n2 = n1;
n1 = n3;
month++;
}
printf("%d",month);
return 0;
}
评注:关于while循环体中三个变量的赋值,一定是先赋n3,若先赋n1,n3不好计算,需增加一个中间变量。本题的一个重要条件是满三月进一月兔进1,注意!
第七章
pratice
7-2 求最大值及其下标
找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
#include <stdio.h>
int main()
{
int n,index,i;
int a[10];//定义数组要说明大小
scanf("%d",&n);//确定数组元素个数
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}//数组初始化
index = 0;
for(i=1;i<n;i++)
{
if(a[index]<a[i])
{
index = i;
}
}
printf("%d %d",a[index],index);
return 0;
}
7-3 将数组中的数逆序输出
#include <stdio.h>
int main()
{
int n,i,temp;
int a[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n/2;i++)
{
temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d",a[n-1]);//这样是保证最后的元素没有空格
return 0;
}
7-4 找出不是两个数组共有的元素
#include <stdio.h>
int main()
{
int m,n,i,j,flag1,flag2,flag3;
int t=0;
int a[20];
int b[20];
int c[40];//最坏情况每个元素都不相同
scanf("%d",&n);//对a[],b[]数组初始化,输入指定元素
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);//&一定不要忘记
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&b[i]);
}
for(i=0;i<n;i++)//遍历数组a[]找出与b[]不相同的元素
{
flag1=1;
for(j=0;j<m;j++)
{
if(a[i]==b[j])//修改了一处bug,这里是判等,而不是赋值
flag1=0;
}
if(flag1==1)
{
c[t++]=a[i];
}
}
for(i=0;i<m;i++)//遍历数组b[]找出与a[]不相同的元素
{
flag2=1;
for(j=0;j<n;j++)
{
if(b[i]==a[j])
{
flag2=0;//第二处bug,这里是赋值,不是判等
}
}
if(flag2==1)
{
c[t++]=b[i];
}
}
printf("%d",c[0]);//打印输出c[]中元素,重复的不输出
for(i=1;i<t;i++)
{
flag3=1;
for(j=0;j<i;j++)
{
if(c[j]==c[i])
{
flag3=0;
}
}
if(flag3==1)
{
printf(" %d",c[i]);
}
}
return 0;
}
exercise
第八章
example
8-4 输入年份和天数,输出对应的年、月、日
#include <stdio.h>
void month_day(int year,int yearday,int *pmonth,int *pday);//申明子函数调用需要加分号
int main()
{
int day,month,year,yearday;
printf("please input year and yearday:");
scanf("%d%d",&year,&yearday);//中间可以不用打空格
month_day(year,yearday,&month,&day);
printf("%d-%d-%d\n",year,month,day);
return 0;
}
//先写子函数再调用
void month_day(int year,int yearday,int *pmonth,int *pday)//定义子函数结尾不需要加分号
{
int k,leap;
int tab[2][13]=//定义二维数组存放非闰年和闰年每月的天数
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},//非闰年每个月的天数
{0,31,29,31,30,31,30,31,31,30,31,30,31},//闰年的2月为29天
};
leap=(year%4==0&&year%100!=0)||year%400==0;//真则置1,假则置0,对应数组的行
//是闰年就是第1行,非闰年就是第0行
for(k=1;yearday>tab[leap][k];k++)//依次与给定行元素对比,大于则减去该元素,剩余数值继续比较
{
yearday-=tab[leap][k];
}
*pmonth=k;//用指针进行参数传递
*pday=yearday;
}
书上非常好的通过指针返回多个值的例子,这里记录对代码的思考过程