刷题---C语言

目录

前言:

一.刷题(1)

1.1打印X图案

1.2打印带空格直角三角形图案

1.3小乐乐改数字

1.4牛牛的线段

2.刷题(2)

2.1判断奇偶性

2.2及格分数

2.3kiki算术

2.4(a+b-c)*d

2.5KiKi算期末成绩


前言:

博文结构开头是本文涉及的题目

牛客网链接;题目截图;【不太懂的会加百度词条】

解题思路;代码通过截图;代码实现;该题收获总结

以上就是本刷题专栏的结构---旨在尽快提升编程能力设置的例行格式

  今日份题目有小乐乐改数字、KiKi算期末成绩、(a+b-c)*d、牛牛的线段、kiki算数、及格分数、判断整数奇偶性、打印X图案、打印带空格直角三角形图案

  较有难度的是:打印X图案、打印带空格直角三角形图案、小乐乐改数字、牛牛的线段。博主先讲这些。


一.刷题(1)

1.1打印X图案

  牛客网链接OJ链接

  解题思路我们输入的数字是行数,很明显这个X图案是由*和空格组合打印出来的,空格如果算上,这是一个n行n列的二维数组正反对角线打印*,其余打印空格

#include <stdio.h>
int main()
{
    int n = 0;
    //多组输入
    while(~scanf("%d", &n))
    {
        int i = 0;
        //打印n行
        for(i = 0; i < n; i++)
        {
            int j = 0;
            //打印第i行里的n列
            for(j = 0; j < n; j++)
            {
                //i和j相等是正对角线
                //i+j等于n-1是反对角线
                if(i == j || i + j == n - 1)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
            //打印完一列换行
            printf("\n");
        }
    }
    return 0;
}

  收获总结正对角线是行和列相等的情况,反对角线是行和列之和等于行数减1;  多组输入的另一中表示方法~scanf("%d", &n);

  补充当scanf读取失败时会返回EOF,EOF的值是-1,如果对-1按位取反(~),由于-1的补码为全1,全部取反就会变成全0,结果就为0(假)

1.2打印带空格直角三角形图案

  牛客网链接OJ链接

  解题思路这道题要求我们输入确定打印的行数,观察一下,这个图形由空格和*组成的,先打印空格,再打印*,并且如果看成是5行5列的二维数组打印单元空格需要两个,打印单元*要加空格

#include <stdio.h>
int main()
{
    int n = 0;
    //多组输入
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        //打印n行
        for(i = 0; i < n; i++)
        {
            int j = 0;
            //打印第i行里的n列
            //1.先打印空格单元
            for(j = 0; j < n - 1 - i; j++)
            {
                //两个空格
                printf("  ");
            }
            //2.打印*加空格
            for(j = 0; j <= i; j++)
            {
                printf("* ");
            }
            //打印完一列换行
            printf("\n");
        }
    }
    return 0;
}

  收获总结在打印这种一列(横向看)由两种单元组成的时候,控制循环是关键观察分析在打印第一行的时候,有4个单元,第二行有3个单元空格,一直到0在打印第一列的时候需要循环4次,用n的话是打印5次,用n-1的话一直是打印4次,再减去随行数增加的行数i,推断一下,i为0的时候,j<n-1-i,单元空格打印4次,i为1时,j<n-1-i,单元空格打印3次,符合就这么做在控制*空格的时候,打印一次,两次,直到n次,j<=i可以在i等于0的时候打印1次,i为1的时候打印两次,符合。也可以这样j<i+1

1.3小乐乐改数字

  牛客网链接OJ链接

  解题思路:这道题的意思是说,输入一个整数,把这个整数里的每一位换成0或1,对应的规则是,如果该位是奇数,改成1,偶数改成0我们给出一个存放32个整型的数组,然后把这个整数的每一位取出来放在数组里,最后再把每一位根据它是第几位,乘上相应的权重后,全部加起来就是我们要求的更换后的数字,最后打印出来

#include <stdio.h>
#include <math.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[32] = {0};
    int i = 0;
    //从低取出n的每一位放到数组里
    while(n)
    {
        //偶数放0
        if(n % 2 == 0)
        {
            arr[i++] = 0;
        } 
        //奇数放1
        else
        {
            arr[i++] = 1;
        }
        //丢弃掉最低的一位
        n /= 10;    
    }
    //由于我们都是放完后,数组的下一位等待放
    //最后一次n已经被改成0,所以让i--变成数组的末下标
    for(i--;i>=0;i--)
    {
        //最后变成的数字是10进制
        n += arr[i] * pow(10, i);
    }
    printf("%d\n", n);
    return 0;
}

  收获总结循环取模,除法,对数组的每一位进行分离拆解;提高在循环中对下标的控制能力;拓宽思维

1.4牛牛的线段

  牛客网链接OJ链接

  解题思路不要看错题目的输入,睁大眼睛看

#include <stdio.h>
#include <math.h>
int main()
{
    int x1, y1;
    int x2, y2;
    //题目说分两组输入
    scanf("%d %d", &x1, &y1);
    scanf("%d %d", &x2, &y2);
    //由于我们没有绝对值,所以要保证是大的数减小的数
    int n = x1>x2?x1-x2:x2-x1;
    int m = y1>y2?y1-y2:y2-y1;\
    //使用一个新的变量接收它们的和,不能直接放在printf里链式访问
    int end = pow(n, 2)+pow(m, 2);
    printf("%d\n", end); 
    return 0;
}

  收获总结第一就是要看清题目,博主第一次在尝试解的时候,对应的输入弄混了,拷到VS里调试一番才知道哪里出问题了;printf("%d\n", pow(n, 2)+pow(m, 2));这个代码它跑不过去,初步判断是因为这是两个函数,它不是像我们想的那样,求出它们的和之后再以整型的方式打印出来,它这样写是错误的最后就是锻炼代码能力

  OK,较难一点的讲完后,把简单的顺便一提吧~都是刷题的见证

2.刷题(2)

2.1判断奇偶性

  牛客网链接OJ链接

  解题思路能被2整除表示成 x % 2 == 0

#include <stdio.h>
int main() {
    int n = 0;
    while(~scanf("%d", &n))
    {
        if(n % 2 == 0)
        {
            printf("Even\n");
        }
        else 
        {
            printf("Odd\n");
        }
    }
    return 0;
}

  收获总结熟练判断奇数偶数的代码敲法;锻炼代码能力

2.2及格分数

  牛客网链接OJ链接

#include <stdio.h>
int main() {
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        if(n >= 60)
        {
            printf("Pass\n");
        }
        else 
        {
            printf("Fail\n");
        }
    }
    return 0;
}

  收获总结锻炼代码能力

2.3kiki算术

  牛客网链接OJ链接

#include <stdio.h>
#include <math.h>
int main()
{
    long long a, b, sum;
    scanf("%lld %lld", &a, &b);
    sum = a + b;
    int i = 0;
    int n = 2;
    int k = 0;
    while(n--)
    {
        k += sum % 10 * pow(10, i);
        i++;
        sum /= 10;
    }
    printf("%d\n", k);
    return 0;
}

  收获总结对于一个有可能溢出的情况,我们需要使用long long类型;锻炼代码能力

2.4(a+b-c)*d

  牛客网链接OJ链接

#include <stdio.h>
int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    printf("%d\n", (a+b-c)*d);
    return 0;
}

  收获总结:锻炼代码能力

2.5KiKi算期末成绩

  牛客网链接OJ链接

#include <stdio.h>
int main() {
    float a, b, c, d;
    scanf("%f %f %f %f", &a, &b, &c, &d);
    float sum = (a * 0.2)+(b * 0.1)+(c * 0.2)+(d * 0.5);
    printf("%.1f\n", sum);
    return 0;
}

  收获总结如果前面输入的地方显示的是一些整数,后面输出的结果又要求是浮点数,那么最开始的输入我们用浮点数来接收,而不是整数;锻炼代码能力

  OK今日份刷题总结到这里,休息一会吧,再接着刷。


  训言:

  保证理解的前提下,保证质量的前提下,多刷题,最后总结!!!!

猜你喜欢

转载自blog.csdn.net/muwithxi/article/details/130884813