2024/3/18 C语言刷题笔记

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  明天继续 ~~~~


  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值