8:44 今日PLAN:刷完浙大版《C语言程序设计(第4版)》题目集之编程题 ACTION!
练习2-1 Programming in C is fun!
#include<stdio.h>
int main()
{
printf("Programming in C is fun!");
return 0;
}
练习2-3 输出倒三角图案
#include<stdio.h>
int main()
{
printf("* * * *\n");
printf(" * * *\n");
printf(" * *\n");
printf(" *");
return 0;
}
练习2-4 温度转换
#include<stdio.h>
int main()
{
int fahr=150;
int cel;
cel=5*(fahr-32)/9;
printf("fahr = 150, celsius = %d",cel);
return 0;
}
练习2-6 计算物体自由下落的距离
#include<stdio.h>
int main()
{
double height=1.0*10*3*3/2;
printf("height = %.2f",height);
return 0;
}
练习2-8 计算摄氏温度
#include<stdio.h>
int main()
{
int f;
scanf("%d",&f);
int c;
c=5*(f-32)/9;
printf("Celsius = %d",c);
return 0;
}
练习2-9 整数四则运算
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d + %d = %d\n",a,b,a+b);
printf("%d - %d = %d\n",a,b,a-b);
printf("%d * %d = %d\n",a,b,a*b);
printf("%d / %d = %d",a,b,a/b);
return 0;
}
练习2-10 计算分段函数[1]
#include<stdio.h>
int main()
{
double x;
scanf("%lf",&x);
double res;
if(x==0)
res=0;
else
res=1.0/x;
printf("f(%.1f) = %.1f",x,res);
return 0;
}
练习2-11 计算分段函数[2]
#include<stdio.h>
#include<math.h>
int main()
{
double x;
scanf("%lf",&x);
double res;
if(x>=0)
res=sqrt(x);
else
res=pow(x+1,2)+2*x+1.0/x;
printf("f(%.2f) = %.2f",x,res);
return 0;
}
练习2-12 输出华氏-摄氏温度转换表
#include<stdio.h>
int main()
{
int lower,upper;
scanf("%d%d",&lower,&upper);
if(lower>upper)
{
printf("Invalid.\n");
return 0;
}
printf("fahr celsius\n");
int flag=0;
for(int i=lower;i<=upper;i+=2)
{
printf("%d%6.1f\n",i,5.0*(i-32)/9);
flag=1;
}
return 0;
}
练习2-13 求N分之一序列前N项和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double s=1;
for(int i=2;i<=n;i++)
s+=1.0/i;
printf("sum = %.6f",s);
return 0;
}
练习2-14 求奇数分之一序列前N项和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double s=1;
for(int i=2;i<=n;i++)
s+=1.0/(2*i-1);
printf("sum = %.6f",s);
return 0;
}
练习2-15 求简单交错序列前N项和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int sign=1;
double s=1;
int fm=4;
for(int i=2;i<=n;i++)
{
sign=-sign;
s+=1.0*sign/fm;
fm+=3;
}
printf("sum = %.3f",s);
return 0;
}
练习2-17 生成3的乘方表
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
long long res;
for(int i=0;i<=n;i++)
{
res=(long long)pow(3,i);
printf("pow(3,%d) = %lld\n",i,res);
}
return 0;
}
练习2-18 求组合数
#include<stdio.h>
double fact(int n)
{
if(n<=1)
return 1;
return n*fact(n-1);
}
int main()
{
int m,n;
scanf("%d%d",&m,&n);
double res=fact(n)/fact(m)/fact(n-m);
printf("result = %.0f",res);
return 0;
}
习题2-1 求整数均值
#include<stdio.h>
int main()
{
int sum=0;
double ave;
for(int i=0;i<4;i++)
{
int x;
scanf("%d",&x);
sum+=x;
}
ave=1.0*sum/4;
printf("Sum = %d; Average = %.1f",sum,ave);
return 0;
}
习题2-2 阶梯电价
#include<stdio.h>
int main()
{
double n;
scanf("%lf",&n);
if(n<0)
printf("Invalid Value!");
else if(n<=50)
printf("cost = %.2f",n*0.53);
else
printf("cost = %.2f",50*0.53+(n-50)*0.58);
return 0;
}
习题2-3 求平方与倒数序列的部分和
#include<stdio.h>
#include<math.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
double sum=0;
for(int i=m;i<=n;i++)
sum+=pow(i,2)+1.0/i;
printf("sum = %.6f",sum);
return 0;
}
习题2-4 求交错序列前N项和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double sum=1;
double sign=1;
for(int i=2;i<=n;i++)
{
sign=-sign;
sum+=sign*i/(2*i-1);
}
printf("%.3f",sum);
return 0;
}
习题2-5 求平方根序列前N项和
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
double sum=1;
for(int i=2;i<=n;i++)
sum+=sqrt(i);
printf("sum = %.2f",sum);
return 0;
}
习题2-6 求阶乘序列前N项和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
long long sum=0;
long long temp=1;
for(int i=1;i<=n;i++)
{
temp*=i;
sum+=temp;
}
printf("%lld\n",sum);
return 0;
}
练习3-2 计算符号函数的值
#include<stdio.h>
int main()
{
int n,sign;
scanf("%d",&n);
if(n<0)
sign=-1;
else if(n==0)
sign=0;
else
sign=1;
printf("sign(%d) = %d",n,sign);
return 0;
}
练习3-3 统计学生平均成绩与及格人数
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int count=0;
double sum=0,ave;
if(n==0)
{
count=0;
ave=0;
}
else{
for(int i=0;i<n;i++)
{
int score;
scanf("%d",&score);
if(score>=60)
count++;
sum+=score;
}
ave=sum/n;
}
printf("average = %.1f\n",ave);
printf("count = %d",count);
return 0;
}
练习3-4 统计字符
#include<stdio.h>
#include<string.h>
int main()
{
char str[10];
char ch;
int letter=0,digit=0,blank=0,other=0;
for(int i=0;i<10;i++)
{
scanf("%c",&ch);
if(isalpha(ch))
letter++;
else if(isdigit(ch))
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 year;
int flag=0;
scanf("%d",&year);
if(year>2100||year<2001){
printf("Invalid year!");
flag=1;
}
else{
for(int i=2001;i<=year;i++)
{
if(i%400==0||(i%4==0&&i%100!=0))
{
printf("%d\n",i);
flag=1;
}
}
}
if(flag==0)
printf("None");
return 0;
}
练习3-7 成绩转换
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
char grade;
n=n/10;
switch(n){
case 10: grade='A'; break;
case 9: grade='A'; break;
case 8: grade='B'; break;
case 7: grade='C'; break;
case 6: grade='D'; break;
default: grade='E';break;
}
printf("%c\n",grade);
return 0;
}
习题9-3 平面向量加法
#include<stdio.h>
#include<math.h>
int main()
{
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
double rx=x1+x2;
double ry=y1+y2;
if(fabs(rx)<=0.05)
rx=fabs(rx);
if(fabs(ry)<=0.05)
ry=fabs(rx);
printf("(%.1f, %.1f)",rx,ry);
return 0;
}
//如在(0.05,0.1),则舍入为0.1
//如在(0,0.05),则为0
//如在(-0.05,0)之间,则不能输出-0.0,要输出0.0
习题8-7 字符串排序
#include<stdio.h>
#include<string.h>
int main()
{
char s[5][81];
for(int i=0;i<5;i++)
scanf("%s",s[i]);
char temp[81];
for(int i=0;i<5;i++)
for(int j=0;j<5-i-1;j++)
{
if(strcmp(s[j],s[j+1])>0)
{
strcpy(temp,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],temp);
}
}
printf("After sorted:\n");
for(int i=0;i<5;i++)
{
printf("%s\n",s[i]);
}
return 0;
}
习题7-7 字符串替换
#include<stdio.h>
#include<string.h>
int main()
{
char str[81];
int i=0;
fgets(str,81,stdin);
int len=strlen(str);
if(str[len-1]=='\n')
str[len-1]='\0';
for(int i=0;i<len;i++)
{
if(str[i]>='A'&&str[i]<='Z')
str[i]='A'+('Z'-str[i]);
}
printf("%s",str);
return 0;
}
习题7-6 统计大写辅音字母
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int vowel(char ch)
{
if(ch=='a'||ch=='o'||ch=='i'||ch=='e'||ch=='u'||ch=='A'||ch=='O'||ch=='I'||ch=='E'||ch=='U')
return 1;
return 0;
}
int main()
{
char str[81];
int count=0;
fgets(str,81,stdin);
int len=strlen(str);
if(str[len-1]=='\n')
str[len-1]='\0';
for(int i=0;i<len;i++)
if(!vowel(str[i])&&isupper(str[i]))
count++;
printf("%d\n",count);
return 0;
}
习题4-10 猴子吃桃问题
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int total=1;
for(int i=1;i<n;i++)
total=(total+1)*2;
printf("%d\n",total);
return 0;
}
习题4-6 水仙花数
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void PrintN(int n)
{
for(int i=pow(10,n-1);i<pow(10,n);i++)
if(narcissistic(i)==1)
printf("%d\n",i);
}
int narcissistic(int number )
{
int temp=number;
int len=0;
while(temp!=0)
{
len++;
temp/=10;
}
int *a=malloc(sizeof(int)*len);
temp=number;
for(int i=0;i<len;i++)
{
a[i]=temp%10;
temp/=10;
}
int sum=0;
for(int i=0;i<len;i++)
{
int temp2=1;
for(int j=0;j<len;j++)
temp2*=a[i];
sum+=temp2;
}
free(a);
if(sum==number)
return 1;
else
return 0;
}
int main()
{
int n;
scanf("%d",&n);
PrintN(n);
return 0;
}
习题4-7 最大公约数和最小公倍数
#include<stdio.h>
int gcd(int a,int b)
{
if(a%b==0)
return b;
return gcd(b,a%b);
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
printf("%d %d\n",gcd(m,n),m*n/gcd(m,n));
return 0;
}
习题4-4 特殊a串数列求和
#include<stdio.h>
int fn( int a, int n )
{
int temp=a;
for(int i=1;i<n;i++)
{
a=a*10+temp;
}
return a;
}
int SumA( int a, int n )
{
int sum=0;
for(int i=1;i<=n;i++)
sum+=fn(a,i);
return sum;
}
int main()
{
int a, n;
scanf("%d %d", &a, &n);
printf("s = %d\n", SumA(a,n));
return 0;
}
习题3-1 比较大小(试试关注底层基本逻辑,不用数组排序了)
#include<stdio.h>
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a<b&&a<c)
{
if(b>c)
{
swap(&b,&c);
}
}
if(b<a&&b<c)
{
swap(&a,&b);
if(b>c)
{
swap(&b,&c);
}
}
if(c<a&&c<b)
{
swap(&a,&c);
if(b>c)
{
swap(&b,&c);
}
}
printf("%d->%d->%d",a,b,c);
return 0;
}
习题6-8 单词首字母大写
#include<stdio.h>
#include<string.h>
int main()
{
char str[1001];
fgets(str,1001,stdin);
int len=strlen(str);
if(str[len-1]=='\n')
str[len-1]='\0';
for(int i=0;i<len;i++)
{
if(i==0)
if(str[i]>='a'&&str[i]<='z')
str[i]-=32;
if(str[i]==' ')
{
if(str[i+1]>='a'&&str[i]<='z')
str[i+1]-=32;
}
}
puts(str);
return 0;
}
习题7-4 求矩阵各行元素之和
#include<stdio.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int a[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<m;i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
sum+=a[i][j];
}
printf("%d\n",sum);
}
return 0;
}
练习7-11 字符串逆序 (这题彻底让我搞懂了gets和fgets的区别)
#include<stdio.h>
#include<string.h>
int main()
{
char str[81];
gets(str);
int len=strlen(str);
for(int i=0;i<len/2;i++)
{
char ch=str[i];
str[i]=str[len-i-1];
str[len-i-1]=ch;
}
puts(str);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char str[81];
fgets(str,81,stdin);
int len=strlen(str);
if(str[len-1]=='\n') //会多保存一个回车
{
str[len-1]='\0'; //替换成反斜杠0然后不要交换它
len--;
}
for(int i=0;i<len/2;i++)
{
char ch=str[i];
str[i]=str[len-i-1];
str[len-i-1]=ch;
}
puts(str);
return 0;
}
习题3-2 高速公路超速处罚(好好好,找到我弱点了,那就是精度问题(包括习题9-3 平面向量加法)
#include<stdio.h>
int main()
{
double s,nos;
scanf("%lf%lf",&s,&nos);
double over=100.0*(s-nos)/nos;
if(over<10)
printf("OK");
else if(over>=10&&over<15)
printf("Exceed %.0f%%. Ticket 200",over);
else
printf("Exceed %.0f%%. License Revoked",over);
return 0;
}
//强转(int)over会丢失精度,所以只能用%.0f输出,而不是%d
练习4-6 猜数字游戏 (顺序结构,if之间的先后顺序也有讲究,我是fw,卡了10分钟)
#include<stdio.h>
int main()
{
int r,n;
scanf("%d%d",&r,&n);
int count=0;
int guess;
while(scanf("%d",&guess),count!=n)
{
count++;
if(guess<r&&guess>0)
{
printf("Too small\n");
}
if(guess>r)
{
printf("Too big\n");
}
if(guess<0)
{
printf("Game Over");
break;
}
if(guess==r)
{
if(count==1)
printf("Bingo!");
else if(count<=3)
printf("Lucky You!");
else if(count<=n)
printf("Good Guess!");
else
printf("Game Over");
break;
}
if(count==n&&guess!=r)
{
printf("Game Over");
break;
}
}
return 0;
}
练习4-7 求e的近似值
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double res=1;
double fact=1;
for(int i=1;i<=n;i++)
{
fact*=i;
res+=1.0/fact;
}
printf("%.8f",res);
return 0;
}
练习4-10 找出最小值
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int min=0;
for(int i=1;i<n;i++)
{
if(a[i]<a[min])
min=i;
}
printf("min = %d",a[min]);
return 0;
}
练习4-11 统计素数并求和
#include <stdio.h>
#include<math.h>
int prime( int p )
{
if(p<=1)
return 0;
for(int i=2;i<=(int)sqrt(p);i++)
if(p%i==0)
return 0;
return 1;
}
int PrimeSum( int m, int n )
{
int sum=0;
for(int i=m;i<=n;i++)
if(prime(i)==1)
sum+=i;
return sum;
}
int main()
{
int m, n, p;
int count=0;
scanf("%d %d", &m, &n);
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
count++;
}
printf("%d %d", count,PrimeSum(m, n));
return 0;
}
习题4-1 求奇数和
#include<stdio.h>
int main()
{
int a[100001];
int i=0;
while(scanf("%d",&a[i]),a[i]>0)
{
i++;
}
int sum=0;
for(int j=0;j<i;j++)
if(a[j]%2==1)
sum+=a[j];
printf("%d",sum);
}
习题4-2 求幂级数展开的部分和(叒是精度温题,误我午休)
#include<stdio.h>
#include<math.h>
double fact(int n)
{
if(n<=1)
return 1;
return n*fact(n-1);
}
int main()
{
double x;
scanf("%lf",&x);
double temp=x,res=1;
double tx=x;
int i=2;
while(fabs(temp)>=0.000001) //0.00001不行
{
res+=temp;
tx*=x;
temp=tx/fact(i);
i++;
}
printf("%.4f",res);
return 0;
}
习题4-3 求分数序列前N项和
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double fz=2,fm=1;
double res=0;
for(int i=0;i<n;i++)
{
res+=fz/fm;
double temp=fz;
fz=fz+fm;
fm=temp;
}
printf("%.2f",res);
return 0;
}
练习7-2 求最大值及其下标
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int max=0;
for(int i=1;i<n;i++)
{
if(a[i]>a[max])
max=i;
}
printf("%d %d",a[max],max);
return 0;
}
习题4-11 兔子繁衍问题
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int f[10001];
f[0]=1;
f[1]=1;
for(int i=2;i<10000;i++)
f[i]=f[i-1]+f[i-2];
int j=0;
for(j=0;j<10000;j++)
{
if(f[j]>=n)
{
break;
}
}
printf("%d",j+1);
return 0;
}
习题4-8 高空坠球
#include<stdio.h>
int main()
{
double preh;
int n;
scanf("%lf%d",&preh,&n);
double total=0;
for(int i=0;i<n;i++)
{
total+=preh;
preh/=2;
total+=preh; //默认还要计算下一次弹起,故加上弹起的高度
}
if(n>0)
printf("%.1f %.1f",total-preh,preh); //结束了,多加了最后一次弹起的距离
else
printf("0.0 0.0");
return 0;
}
15:49 哎,被几道精度题卡的有点久,今天就做到这儿了 48/72 明天继续 ~~~~