每日练习---C语言

简介: 每日练习---C语言

前言:


 记录博主做题的收获,以及提升自己的代码能力,今天写的题目是:打印菱形、打印水仙花数。


1.打印菱形


 我们先看到牛客网的题:OJ链接



 题目解析:多组输入一个值(我们用n来控制)用来控制菱形的打印。


 思路:将最长一行的之上的看成是上半部分,包括最长一行在内的之下划为下半部分;上部分是n行,有n列,每一列由空格和星号组成,空格减少,星号增多;下半部分是n+1行,有n+1列,空格增多,星号减少;

#include <stdio.h>
int main()
{
    int n = 0;
    //1.多组输入
    while(scanf("%d", &n) != EOF)
    {
        //i控制行
        int i = 0;
        //2.打印上半部分
        for(i = 0; i < n; i++)
        {
            int j = 0;
            //2.1打印对应行的空格列
            for(j = 0; j < n - i; j++)
            {
                printf(" ");
            }
            //2.2打印对应行的星号列
            for(j = 0; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n");//一列打印完换行
        }
        //3.打印下半部分
        for(i = 0; i < n + 1; i++)
        {
            int j = 0;
            for(j = 0; j < i; j++)
            {
                printf(" ");
            }
            for(j = 0; j < n + 1 - i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;    
}


1.1补充练习

 打印出下面的图案:


 还是一样的思路,分为上半部分和下半部分,上面有6行,那我们输入的时候就把n输进去一个6,下半部分是7行,也就是n+1。

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    for(i = 0; i < n; i++)
    {
        int j = 0;
        for(j = 0; j < n - i; j++)
        {
            //看图会发现是两个空格
            printf("  ");
        }
        //第一次是1个,后面每次增加2
        //i一开是为0,没往下一行,就多打印两个*
        for(j = 0; j < 1 + 2 * i; j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    for(i = 0; i < n + 1; i++)
    {
        int j = 0;
        for(j = 0; j < i; j++)
        {
            printf("  ");
        }
        //7行打印13个 2*n+2是14,减去1等于13,刚好
        //对于下半部分,第一行i为0不减,没往下一行,就多减2个星号的打印
        for(j = 0; j < 2*n + 2 - 1 - 2*i; j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}



 相信看完后,读者对循环的掌控可以更如鱼得水一点~


2.打印水仙花


 水仙花数的定义:有一个n位数,它的每一位数的n次方之和等于它本身。例如153这个数字:153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27。


 我们先看到牛客网的题:OJ链接



 题目的意思是说:多组输入两个整数m和n;输出在m和n范围内的水仙花数,并且用空格隔开。水仙花在范围内[m,n],我们遍历的时候,是就打印,不是就跳过,水仙化数自然是从小到大排列的。


#include <stdio.h>
#include <math.h>
int main()
{
    int m, n;
    int flag = 1;
    //1.多组输入
    while(scanf("%d%d", &m, &n) != EOF)
    {
        //2.创建i,并用i遍历区间[m,n]
        int i = 0;
        for(i = m; i <= n; i++)
        {
            //3.用k当做i的副本使用,不要在循环内改变循环变量i
            int k = i;
            int sum = 0;
            while(k)
            {
                //题目已知是三位数,用3直接当做次方
                sum += pow(k%10, 3);
                k /= 10;
            }
            //4.如果加起来的sum等于i,就是水仙花数
            if(sum == i)
            {
                printf("%d ", i);
                //有打印,就把flag改成0
                flag = 0;
            }
        }
        //5.如果全部遍历完,没有打印出一个水仙花,flag没有被改成0
        //就在这里打印出no
        if(flag)
        {
            printf("no");
        }
    }
}


 解释:看到第3步骤,假设k是123,进入循环,k取模上10得到3,pow(3, 3)是3的3次方,然后k /= 10,123除以10商12,把12赋值给了k;接着循环,直到k /= 10把商为0赋值给k,循环结束。


 补充:注意sum要定义在for循环内,不能定义在for循环外,这样sum在每次重新判断一个数是不是水仙数的时候,都会带着上次求的sum值。或者定义在外面,每次for循环重新赋值成0。


2.1补充训练

 打印0-100000(十万)之间的水仙花数。

#include <stdio.h>
#include <stdio.h>
int main()
{
    int i = 0;
    for(i = 0; i < 100000; i++)
    {
        //1.求i的几位数的
        int n = 1;
        int m = i;
        while(m/=10)
        {
            n++
        }
        //2.求每一位数的n次阶乘之和
        m = i;
        int sum = 0;
        while(m)
        {
            sum = pow(m%10, n);
            m /= 10;
        }
        //3.判断sum等不等于i
        if(sum == i)
        {
            printf("%d ", i);
        }
    }
    return 0;
}


 解释:求i是几位数的时候,n从1开始是因为,假设我们此时i是12,m被初始化为12,m/10会以1的值进入循环,并被赋值成1,然后n++一次;接着m/10为商0余1,进不去循环了,如果一开始我们的n是从0开始的,那么只经过一次n++,n为1,实际上i是两位数;所以n一开始设成1,这是因为无论是什么数,一开始都有一位数。


 总结:多组输入的方法、控制循环的训练、将一个整数一个一个剥离下来的方法、以及锻炼手敲代码的能力和不怕出错进行调试的抗压心态。


 希望大家读完,可以自己找到题目实现一遍,祝读者们有所收获。(喜欢的话麻烦留个小赞再走呗)!

相关文章
|
5月前
|
C语言 数据安全/隐私保护
C语言初阶②(分支语句和循环语句)编程练习
C语言初阶②(分支语句和循环语句)编程练习
53 1
|
5月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
43 0
|
5月前
|
C语言
C语言指针——练习
C语言指针——练习
|
5月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
40 0
|
4月前
|
C语言
C语言练习代码第一篇
C语言练习代码第一篇
|
5月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
49 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
4月前
|
C语言
|
5月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
18 0
|
4月前
|
编译器 C语言
|
4月前
|
C语言