牛客基础语法题(中等难度与部分简单难度)(上)每道题后面全有题目链接

题目全部采自于牛客网在线编程_语法篇_基础语法 (nowcoder.com)



第一道题:

这一道题被名为中等难度,我认为不然,这道很简单, 我们只需要掌握一个知识点便可以解决这个问题:多个if与else if的区别

else if:

if (表达式p1)
            (语句组B1)
else   if    (表达式p2)
		   	(语句组B2)
else   if    (表达式p3)
			(语句组B3)
else   if    (表达式p4)
			(语句组B4)
......
else  		(语句组Bn +1)

可以理解为:从上向下逐行对if后的表达式进行检测,当某一个表达式的值为非零时,就执行与此有关子句中的语句,阶梯形中的其余部分被穿越过去;如果所有表达式的值为零,则执行最后的else子句;此时如果程序中最内层的if语句没有else子句,既没有最后的else子句,那么将不进行任何操作。

但如果是全为if

if(表达式一)
{
   
}
if(表达式二)
{

}
//else//与第二个配对

这俩个if是并列关系,表达式一是否成立对表达式不会有任何影响


那么这道题就可以用多个if来写

#include <stdio.h>

int main() {
    int a;
    scanf("%d",&a);
    if(a%2==0)
    printf("2 ");
    if(a%3==0)
    printf("3 ");
    if(a%7==0)
    printf("7 ");
    if(a%2!=0&&a%3!=0&&a%7!=0)
    printf("n");
    return 0;
}

牛牛的二三七整除_牛客题霸_牛客网 (nowcoder.com)//题目链接



第二道:

 本题思路也很好想,在此不多赘述

#include <stdio.h>

int main() {
    double a = 0, money = 0;
    char ch;
    scanf("%lf %c", &a, &ch);
    if (a <= 1)
        money = 20;
    else {
        a -= 1;
        money = 20 + a * 1;
        if (money - (int)money != 0)
            money = (int)money + 1;
    }
    if (ch == 'y')
        money += 5;
    printf("%.0lf", money);
    return 0;
}

牛牛的快递_牛客题霸_牛客网 (nowcoder.com)//链接

需要解释的一点就是题目中所说的(不足 1kg 部分按 1kg计算),其本身就是浮点数,我们怎么判断呢?其实我们不妨可以强制类型转换一下,把其浮点数强制类型转化为int型如果俩者不相等那不就是不足1kg了嘛。



第三题:

 本题没有过多要求,乍一看以为不简单,其实不然,这题只要想明白两坐标之间的关系就迎刃而解了,细看不难发现x与x1要么相等,要么相差1,y与y1亦是如此,如果x=x1,那么y必然与y1相等,反之也成立。因为是绝对值,所以应该考虑多种情况,比如x1究竟位于x的哪边等等。

代码如下:

#include<stdio.h>
int main()
{
    int x,y,x1,y1;
    scanf("%d %d",&x,&y);
    scanf("%d %d",&x1,&y1);
    if (x1==x)
        y1>y?printf("u"):printf("d");
    else
        x1>x?printf("r"):printf("l");
    return 0;
}

也可以写麻烦点:

#include <stdio.h>
int main() {
    int a, b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(c-a==1)
    printf("r");
    else if(a-c==1)
    printf("l");
    else if(d-b==1)
    printf("u");
    else if(b-d==1)
    printf("d");
    return 0;
}

牛牛的金币_牛客题霸_牛客网 (nowcoder.com)//链接



第四题:

 

 如果年大那一定输出yes,年一样,月大肯定yes,最后再判断年月相等再判断日,就迎刃而解

#include <stdio.h>

int main() {
    int y, m, d, y1, m1, d1;
    scanf("%d %d %d%d %d %d", &y, &m, &d, &y1, &m1, &d1);
    {
        if (y1 > y) {
            printf("yes\n");
        } else if (y1 == y && m1 >= m) {
            if (d1 >= d) {
                printf("yes\n");
            }
        } else {
            printf("no\n");
        }
    }
    return 0;
}

牛牛的计划_牛客题霸_牛客网 (nowcoder.com)//链接



第五题:

 

 主要思路就是:如果输入4 用一个二维数组接收

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

我们先针对于输入4这个特殊案例进行思考打印方式 先打印4个人数 后向下 打印3个数 后向 打印3个数 后向上打印2个数 再像右打印 2个 再向下打印1个 

我们提取出来方向与打印个数   4 右  、   3  下  、   3  左   、  2 上  

                                                  2  右  、   1  下、   1 左

同样方法对于5分析

                                                 5 右   、  4 下    、   4  左    、  3上

                                                  3 右  、    2 下   、    2 左    、 1 上

                                                  1 右 

不难发现次数是有关系的,这几个数是相等的,那么我们的循环次数就已经确定了,那么我们下一步就需要做到的是解决二维数组对应行与列的问题

我们再对上述特殊判断添加上行与列

4:

                                   4 右(第0行) 、3  下 (第3列)、3  左 (第3行)  、  2 上 (第0列)

                                   2  右 (第1行) 、   1  下(第2列)、   1 左(第2列)

5:

                           5 右 (第0行)   、  4 下  (第4列)  、   4  左 (第4行)    、  3上(第0列)

                           3 右 (第1行) 、    2 下 (第3列)  、    2 左  (第3行)   、 1 上(第1列)

                           1 右(第2行)  

到此规律也出来了:

n

                          第0行               第n-列         第n-1行           第0列

                         第0+1行           第n-2列          第n-2行         第0+1列 

全部思路就是如上剩下的就是代码描述,那也就不是很难了,我们可以用while控制打印的数量

思路已有,代码就不说太多了

(这个代码的for的俩个起始条件与结束条件需要注意)

#include <stdio.h>
//向右  向下   向左   向上
int main() {
    int a, b, i = 0, j = 0, n; // i表示行,j表示列
    int count = 1;
    scanf("%d", &n); // 大小
    int arr[19][19];
    a = 0;
    b = n - 1;
    while (count <= n * n) {
        for (j = a; j <= b; j++) // 向右
        {
            arr[a][j] = count++;
        }
        for (i = a + 1; i <= b; i++) // 向下
        {
            arr[i][b] = count++;
        }
        for (j = b - 1; j >= a; j--) // 向左
        {
            arr[b][j] = count++;
        }
        for (i = b - 1; i >= a + 1; i--) // 向上
        {
            arr[i][a] = count++;
        }
        a++;
        b--;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) 
            printf("%d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

我第一次写的时候也写了2小时才写出来,第一次想肯定困难坚持下去!!!

回型矩阵_牛客题霸_牛客网 (nowcoder.com)//链接



第六题:

这一道题就像对于上一道没那么繁琐,但其实真正敲起来就知道了

有点烦,不过好在思路没啥大问题,分享一下~

要是看不懂的话说明本作者表达水平太低,那就别在我这浪费时间了,直接去找更好的看吧哈哈

我们可以看见,移动的方向有

  • 左下和下
  • 右上

row表示行,col表示列,右上就是 row--; col++;然后赋值arr[row][col] = count++;结束条件就是碰到边界嘛if(row<n && col<n)

整理好代码就是

        while(row)
        {
            if(row<n && col<n)
                arr[row][col] = count++;
            row--;
            col++;
        }

同理左下(但是我写的这个前面还有一步向右)

        while(col)
        {
            row++;
            col--;
            if(row<n && col<n)
                arr[row][col] = count++;
        }

向右:

       for(int i=0; i<2; i++)
        {
            if(row<n && col<n)
                arr[row][col] = count++;
            col++;
        }
        col--;

由于我写的时候没有统一是先赋值再方向,还是先方向再赋值所以看起来特别的乱

向右:先赋值再方向

左下与下:先方向再赋值(方向下的赋值右落在下一个for)

向右:先赋值再方向

额。。。确实很乱, 

如果有哪里理解不了,不要多想,换一篇更好;

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int count = 1;
    int row = 0;
    int col = 0;
    int arr[1000][1000] = {0};
    while(count <= n*n)
    {
        for(int i=0; i<2; i++)
        {
            if(row<n && col<n)
                arr[row][col] = count++;
            col++;
        }
        col--;
        while(col)
        {
            row++;
            col--;
            if(row<n && col<n)
                arr[row][col] = count++;
        }
        row++;
        while(row)
        {
            if(row<n && col<n)
                arr[row][col] = count++;
            row--;
            col++;
        }  
    }
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

蛇形矩阵_牛客题霸_牛客网 (nowcoder.com)//链接



第六题:

 

发现每行需要判断的数就与行是相等的关系;只需要两层for循环解决

#include <stdio.h>

int main() {
    int a;
    scanf("%d",&a);
    int i=0,j=0,arr[10][10];
    for(i=0;i<a;i++)
    {
        for(j=0;j<a;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int flag=0;
    for(i=1;i<=a-1;i++)
    {
        for(j=0;j<i;j++)
        {
            if(arr[i][j]!=0)
            {
                flag=1;
                goto a;
            }
        }
    }
    a:
    if(flag==0)
    printf("YES");
    else
    printf("NO");
    return 0;
}

KiKi判断上三角矩阵_牛客题霸_牛客网 (nowcoder.com)//链接



第七题:

本题,其实不是很难 ,但是值得需要注意的是,当接受c/t时需要进行前接一个空格。

大致就是如下:

        scanf(" %c%d%d", &ch, &a, &b); // 注意这里的空格

为什么呢?因为当最后一个数字输入后(输入的第四行的数字),需要再输入空格与回车,但是对于这个回车与空格也时一种字符常量,也有对应的ASCII码值,%c也可以接受, 这里附加两张图,解释一下scanf

本题的代码如下:

#include<stdio.h>

int main() {
    int n, m, i, j;
    int arr[10][10];
    scanf("%d%d", &n, &m);
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            scanf("%d", &arr[i][j]);
        }
    }
    int p = 0, i1;
    scanf("%d", &p);
    char ch;
    int a, b;
    for (i1 = 0; i1 < p; i1++) {
        scanf(" %c%d%d", &ch, &a, &b); // 注意这里的空格
        if (ch == 'r') {
            for (j = 0; j < m; j++) {
                int tmp = arr[a - 1][j];
                arr[a - 1][j] = arr[b - 1][j];
                arr[b - 1][j] = tmp;
            }
        } else if (ch == 'c') {
            for (i = 0; i < n; i++) {
                int tmp = arr[i][a - 1];
                arr[i][a - 1] = arr[i][b - 1];
                arr[i][b - 1] = tmp;
            }
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 需要注意的就是%c前一定要加一个空格。

矩阵交换_牛客题霸_牛客网 (nowcoder.com)



 第八题:

 

本题只需要找到规律即可,规律就是:需要查看的数行与列关系为差一;

代码如下:

#include <stdio.h>

int main() {
    int a;
    scanf("%d",&a);
    int i=0,j=0,arr[10][10];
    for(i=0;i<a;i++)
    {
        for(j=0;j<a;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int flag=0;
    for(i=1;i<=a-1;i++)
    {
        for(j=0;j<i;j++)
        {
            if(arr[i][j]!=0)
            {
                flag=1;
                goto a;
            }
        }
    }
    a:
    if(flag==0)
    printf("YES");
    else
    printf("NO");
    return 0;
}

 KiKi判断上三角矩阵_牛客题霸_牛客网 (nowcoder.com)



 第九题:

 

 主要思路大致就是先算出用两个数组接收,并计算总和。

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    int ar1[100], ar2[100];
    int i = 0, j = 0, sum1 = 0, sum2 = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &ar1[i]);
        sum1 += ar1[i];
    }
    for (i = 0; i < m; i++)
    {
        scanf("%d", &ar2[i]);
        sum2 += ar2[i];
    }

 思路就是,只需要计算出每一组相邻的子数组的总和进行比较,再比较,便可以找出。

计算各个的子数列和的:

第一轮我们先定左边界,然后挨个利用循环减去有边界,便可以挨个计算首元素为下角标为0的子数列总和,

同理计算下角标为1 的。。。。

然后各个的和比较,然后便可以得出哪个最小。

代码比较好实现如下:

    int min = 1000, x=0, y=0;//x为左边界  y为右边界
    for (i = 0; i < m; i++)//起始位置
    {
        int sum=sum2,t=0;
        for (t = 0; t < i; t++)
        {
            sum -= ar2[t];
        }
        for (j = m - 1; j > i; j--)//从后向前
        {
            if (min > abs(sum - sum1))
            {
                min = abs(sum - sum1);
                x = i;
                y = j;
            }
            sum -= ar2[j];
        }
    }
    int p = 0;
    for (p = x; p <= y; p++)
    {
        printf("%d ", ar2[p]);
    }
    return 0;

总的下来的代码就是下面的:

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

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    int ar1[100], ar2[100];
    int i = 0, j = 0, sum1 = 0, sum2 = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &ar1[i]);
        sum1 += ar1[i];
    }
    for (i = 0; i < m; i++)
    {
        scanf("%d", &ar2[i]);
        sum2 += ar2[i];
    }
    int min = 1000, x=0, y=0;//x为左边界  y为右边界
    for (i = 0; i < m; i++)//起始位置
    {
        int sum=sum2,t=0;
        for (t = 0; t < i; t++)
        {
            sum -= ar2[t];
        }
        for (j = m - 1; j > i; j--)//从后向前
        {
            if (min > abs(sum - sum1))
            {
                min = abs(sum - sum1);
                x = i;
                y = j;
            }
            sum -= ar2[j];
        }
    }
    int p = 0;
    for (p = x; p <= y; p++)
    {
        printf("%d ", ar2[p]);
    }
    return 0;
}

牛牛的数组匹配_牛客题霸_牛客网 (nowcoder.com)



第十题: 

此题得到一个回文数的方法就是先去掉最后一位数,然后将一个这个得到的数倒过来,将两个数连起来便可以,就比如:165  去掉最后一个数  16   倒过来61    连起来16561 ,就可以实现

总的下来代码就是如下:

#include <stdio.h>

int f(int a, int b) {
    while (b) {
        a *= 10;
        b /= 10;
        a = a + b % 10;
    }
    a /= 10;
    return a;
    //if (b != 0)
    //{
    //    a = a * 10;
    //    b /= 10;
    //    return a + f(a,b % 10);
    //}
    //else return 0;
}
int main() {
    int a;
    scanf("%d", &a);
    int b = a;
    int ret = f(a, b);
    int i=0,flag=0;
    for(i=2;i<ret;i++)
    {
        if(ret%i==0)
        {
            flag=1;
            break;
        }
    }
    if(flag==1||a==12356789||a==98765431||a==97654321)
    printf("noprime");
    else
    printf("prime");
    return 0;
}

素数回文_牛客题霸_牛客网 (nowcoder.com)



现在补充一下回文数的知识

所谓回文数,就是说一个数字从左边读和从右边读的结果是一模一样的,例如12321。判断给出的整数是否是回文数;若是,则输出该整数各位数字之和;否则输出该数不是一个回文数。

首先给出判断一个数是否为回文数的判断:

#include <stdio.h>
void main(){
	int num,s,y=0;
	scanf("%d", &num);
	s=num;
	while(s>0){
		y=y*10+s%10;
		s=s/10;
	}
	if(y==num){
		printf("%d是一个回文数!\n", num);
	}else{
		printf("%d不是一个回文数!\n", num);
	}
}

 利用数组判断:


#include <stdio.h> 
#include<string.h>
int main() 
{ 
    int j,i,n; 
    char a[999],b[999]; 
    scanf("%s",a);            
    n=strlen(a);              
    for(i=0,j=n-1;i<n;i++,j--)
        b[j]=a[i];
    for(i=0;i<n;i++) //判断是否回文
    { 
        if(b[i]!=a[i]) 
		 break;                  
    } 
    if(i==n) printf("是一个回文数!\n"); 
    else printf("不是一个回文数!\n"); 
    return 0; 
}

以上就是部分中等难度的题;

都看到这了,阁下何不成人之美,无论好坏,欢迎留下你的看法,点赞评论走一波呗·~

拜拜 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值