C语言经典题目(12)

简介: C语言经典题目(12)

56.倒三角形

在这里插入图片描述

#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i - 1; j++)
            printf(" ");
        for (int k = 1; k <= n - i + 1; k++)
            printf("# ");
        printf("\n");
    }
    return 0;
}

57.求子序列的和

在这里插入图片描述

#include<stdio.h>
int main()
{
    int n,m,i,k=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        double sum=0;
        if(n==0&&m==0)
        {
            break;
        }
        for(i=n;i<=m;i++)
        {
            sum=sum+(1.0/i)/i;//换成i*i会有运算结果溢出//
        }
        k++;
        printf("Case %d: %.5lf\n",k,sum);
    }
    return 0;
}

58.分数化小数

在这里插入图片描述

#include<stdio.h> 
int main()
{
    int a,b,c,s=0;
    double m; 
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    {
        if(a==0&&b==0&&c==0)
        {
            break;
        }
        m=1.0*a/b;
        s++;
        printf("Case %d: %.*f",s,c,m); 
    }
    return 0;
} 
printf(“% . lf\n”, a, b, c); 会输出a个字宽保留b位小数的浮点数运算结果c。

该解法会出现精度问题,所有使用下面的数学解法。

#include <stdio.h>

int main()
{
    int a, b, c, ct = 1;
    while(3 == scanf("%d%d%d", &a, &b, &c))
    {
        if(0 == a && 0 == b && 0 == c) break;
        int integer = a / b;                        // 获得整数部分
        printf("Case %d: %d.", ct++, integer);
        a %= b;         // 获得余数
        int i = 1;
        // 进行c-1次模数学拟除法求出小数点后c-1位,因为要四舍五入,所以最后一位单独处理
        while(i++ < c)
        {
            a *= 10;
            printf("%d", a / b);
            a %= b;
        }
        a *= 10;
        // 判断最后一位的下一位是否大于5,进行四舍五入
        printf("%d\n", ((a % b) * 10 / b > 5) ? (a / b + 1) : (a / b));
    }
    return 0;
}

59.开灯问题

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#define maxn 1010
int a[maxn];
int main()
{
    int n, k, first = 1;
    memset(a, 0, sizeof(a));
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= k; i++)
        for (int j = 1; j <= n; j++)
            if (j % i == 0) a[j] = !a[j];
    for (int i = 1; i <= n; i++)
        if (a[i]) 
        { 
            if (first) 
                first = 0; 
            else 
                printf(" "); 
            printf("%d", i); 
        }
    printf("\n");
    return 0;
}

在这里插入图片描述

“memset(a,0,sizeof(a))”的作用是把数组a清零,它也在string.h中定义。虽然也能
用for循环完成相同的任务,但是用memset又方便又快捷。另一个技巧在输出:为了避免输出
多余空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个。第一个变 量前不应有空格,但其他变量都有。

60.蛇形填数

在这里插入图片描述
解法一:

#include<stdio.h>
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main()
{
int n, x, y, tot = 0;
scanf("%d", &n);
memset(a, 0, sizeof(a));
tot = a[x=0][y=n-1] = 1;
while(tot < n*n)
{
while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;
while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;
while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;
}
for(x = 0; x < n; x++)
{
for(y = 0; y < n; y++) printf("%3d", a[x][y]);
printf("\n");
}
return 0;
}

解法二:

#include<stdio.h>
int a[100][100],book[100][100];
int main()
{
    int n,i,j,step=2,x=0,y=0,tx,ty;
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//右,下,左,上。若想要输出逆时针蛇行填数,只需要改变几个坐标顺序就好了
    scanf("%d",&n);
    a[0][0]=1;//把第一个数保存下来
    book[0][0]=1;//把第一个数标记,防止重复使用
    for(i=0;i<4;)
    {
          tx=x+next[i][0];//从第二个点开始
          ty=y+next[i][1];
          if(ty>n-1||tx>n-1||book[tx][ty]==1||ty<0)/*先让这个人一直沿右走,直到它的众坐标,或者横坐标大于这个矩阵的边界值,或者小于边界值,再或者这个点已经走过了,此时要改变方向*/
          {
              i++;//改变方向
              if(i==4)//需要判断是否已经走过一圈了,如果走到一圈后,i要赋值为零再从新按顺时针走一圈
              {
                    if(step>n*n)//走完一圈判断步数是否大于n*n
                    break;
                    else
                    i=0;//从新按顺时针方向走
                }
                tx=x+next[i][0];//计算改变方向后的第一个数,并标记这个点已经走过
                ty=y+next[i][1];
                a[tx][ty]=step;
                book[tx][ty]=1;
                step++;
            }    
            if(a[tx][ty]==0&&book[tx][ty]==0)//如果这个数是零,并且这个点没有走过,就留下对应的数
            {
                a[tx][ty]=step;
                book[tx][ty]=1;
                step++;
            }
            x=tx;y=ty;
            if(step>n*n)
                break;
        }

    //输出结果
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%3d ",a[i][j]);
        printf("\n");
    }
    return 0;
}
相关文章
|
6月前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
6月前
|
存储 C语言 C++
C语言------------指针笔试题目深度剖析
C语言------------指针笔试题目深度剖析
47 1
|
11月前
2.C语言题目---字符串左旋
2.C语言题目---字符串左旋
77 1
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
11月前
|
存储
1.C语言题目---指针类(基础)
1.C语言题目---指针类(基础)
60 1
|
3月前
|
存储 编译器 C语言
【C语言】指针练习题目
【C语言】指针练习题目
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
46 1
|
6月前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
5月前
|
C语言
c语言循环题目
c语言循环题目
|
6月前
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)