刷题---C语言(一)

简介: 刷题---C语言(一)

前言:


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


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


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


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


 今日份题目有:小乐乐改数字、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,较难一点的讲完后,把简单的顺便一提吧~都是刷题的见证。

相关文章
|
6月前
|
编译器 C语言
C语言刷题(1)
C语言刷题(1)
51 0
|
8月前
|
编译器 测试技术 C语言
|
4月前
|
存储 IDE 编译器
c语言选择题常见知识点汇总 ------持续更新
当使用free释放掉一个指针内容后,指针变量的值不会被置为NULL,free不会更改指针指向、32位系统下任何类型指针的长度都是4个字节、指针的数据类型声明的是指针实际指向内容的数据类型、野指针是指向未分配或者已经释放的内存地址
|
5月前
|
C语言
C语言每日一练---Day(14)
C语言每日一练---Day(14)
39 0
|
5月前
|
C语言 数据安全/隐私保护
C语言刷题
C语言刷题
38 1
|
5月前
|
C语言
C语言每日一练----Day(12)
C语言每日一练----Day(12)
23 0
|
5月前
|
C语言
C语言每日一练----Day(13)
C语言每日一练----Day(13)
26 0
|
6月前
|
编译器 C语言
C语言刷题指南(三)
C语言刷题指南(三)
42 0
|
6月前
|
C语言
C语言刷题指南(一)
C语言刷题指南(一)
110 0
|
6月前
|
算法 C语言
C语言刷题指南(四)
C语言刷题指南(四)
38 0