大数据二班期末模拟

从难到易给几题的题解,一些水题就不打了。
最后一题:
20 数字三角形3

基本思路:
其实它的赋值位置是一个循环,什么样的循环呢?
先从最后一排从前往后铺路,再从最后一列从下往上铺路,最后一个“下楼梯”回到倒数第二行。完成一次循环,下一个循环就从刚刚停下来的地方往前继续。

在这里插入图片描述
如图,1->12就是一个三角循环。然后13开始再来一个这样的。
那什么时候结束呢?会发现,终止的数字和输入的n是有关系的。看上面的图,从第一列开始数每列数字,1+2+3+4+5(n),等等,这不就是前n项和吗?所以,我们的终止条件就是这个数增加到了(1+n)*n/2。
每次循环的开始及结束位置和你的循环次数有关,这里就留下点思考空间了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int i , j;
    int n;
    scanf("%d",&n);
    int a[50][50];
    memset(a,-1,sizeof(a));  int flag=0;
    int tot=1;  int count=0;
      while(n)
        {

            for(j=0+count*2;j<=n-1-count*1;j++)
    {

        a[n-1-count][j]=tot;
         if(tot==((1+n)*n/2))  {flag=1; break;}
        tot++;
    }
    if(flag)  break;
    for(i=n-2-count;i>=0+count*2;i--)
    {

        a[i][n-1-count]=tot;
        if(tot==((1+n)*n/2))  {flag=1; break;}
        tot++;
    }
        if(flag)  break;
    for(i=1+count*2,j=n-2-count;i<=n-2-count;i++,j--)
    {

        a[i][j]=tot;
        if(tot==((1+n)*n/2))  {flag=1; break;}
        tot++;
    }
    if(flag)  break;
         count++;
        }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {

            if(a[i][j]==-1)
            printf("%5c",' ');
            else
            printf("%5d",a[i][j]);
            if(j==n-1)  printf("\n");
        }
    }


}

2.
19 菱形旋转

这个题目有几个坑点要注意,第一个是读入字符时候,它会多读一个n后面的回车,这时候要先读一个回车抵消掉。
然后第二个就是不要以为读进来题目数据就完了,我们毕竟要旋转矩阵,旋转的过程其实就是元素交换的过程,那么我要保证不越界,那么就确保矩阵是一个以最大长长为边的矩阵。比如输入5我就要用到5*5的矩阵。所以读入数据的时候,要把每行后面铺满空格。

#include <stdio.h>
#include <stdlib.h>

char a[20][20]={{0}};
char b[20][20]={{0}};

int main()
{
    int i,j,n,w,t;
    scanf("%d", &n);
char s; j=0; 
        s=getchar();  //抵消回车
        for(i=0;i<n;i++)
        {
            while((s=getchar())!='\n')
            {
                if(s==' ')  a[i][j++]=32;
              else a[i][j++]=s;}
           // printf("%c",s);
            int k;
            for(k=j;k<n;k++)
            a[i][k]=32;
            j=0;
        }

    scanf("%d", &w);
    w=(w%360)/90;
    for(t=0; t<w; t++)
    {
/********please correct here**************
        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++)
                b[i][j]=a[j][i];
***************************************/
      int l;
          for(i = 0; i < n; i ++)
        {
            for(l = n - 1;l >= 0; l --)
               b[i][n-1-l]=a[l][i];
           // printf("\n");
        }
        for(i = 0; i < n; ++i)
            for(j = 0; j < n; j++)
                a[i][j] = b[i][j];
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            if(a[i][j]<32)
                printf(" ");
            else
                printf("%c", a[i][j]);
        printf("\n");
    }
    return 0;
}

发布了33 篇原创文章 · 获赞 23 · 访问量 1835

猜你喜欢

转载自blog.csdn.net/qq_45492531/article/details/103392293