牛客刷题【c语言】

题目:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

int Print(int n)
{
	int i = 0;
	printf("奇数\n");
	for (i = 0; i <= 30; i += 2)
	{
		printf("%d", (n >> i) & 1);
	}
	printf("\n");
	printf("偶数\n");
	
	for (i = 1; i <= 31; i+=2)
	{
		printf("%d", (n >> i) & 1);
	 }
  }
int main()
{
	      int n = 0;
	     scanf("%d", &n);
		 int ret =Print(n);
	return 0;
}

假设n的二进制序列为
00011000 01000000 00001000 00110001
如果n的最后一位是1 n&1的结果就是1 ,如果n的最后一位是0 ,n&1的结果就是0 。那最后一位就搞定了 ,那怎么让n的奇数位都来到最后一位 ? 这里我们采用 (n>>i)&1 并且 i+=2 就可以了。


题目二 :[编程题]两个整数二进制位不同个数

链接
https://www.nowcoder.com/questionTerminal/9c3b8a8d9f1c4ae3b709d04625586225
方法一:

 int count_diff_one(int m, int n)
{
	 int i = 0;
	 int count = 0;
	 for (i = 0; i <= 32; i++)
	 {
		 if (  ( (m>>i)&1 ) !=  ( (n>>i)&1 ) )
		 {
			 count++;
		 }
	 }
	 return count;
}
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	 int ret =count_diff_one(m, n);
	 printf("%d", ret);
	return 0;
}

方法二:

 int count_diff_one(int m, int n)
{
	 int  tmp = m ^ n;
	 int count = 0;
	 while (tmp)
	 {
		  tmp =tmp& (tmp - 1);
		 count++;
	}
	 return count;
}
int  main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	 int ret =count_diff_one(m, n);
	 printf("%d", ret);
	return 0;
}

关于上述代码的解释:
^的规则是 相同为0 ,相异为1 。也就是说我们只需要统计有几个1就行了。每执行一次 tmp = tmp &(tmp-1)就能统计一个1


题目:小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?


链接https://www.nowcoder.com/practice/ebf04de0e02c486099d78b7c3aaec255?tpId=107&&tqId=33398&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking

  int Fib(int n)
{
	  if (n<=2	)
		  return n;
	  else 
	  {
		  return Fib(n - 1) + Fib(n - 2);
	  }
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	 int ret =Fib(n);
	 printf("%d", ret);
	return 0;
}

关于上述代码的解释:
在这里插入图片描述


题目:KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
https://www.nowcoder.com/practice/13aeae34f8ed4697960f7cfc80f9f7f6?tpId=107&&tqId=33335&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking
方法一:

#include<stdio.h>
int get_days_of_month(int y, int m) 
{
    int day = 0;
    switch (m)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        day = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        day = 30;
        break;
       case 2: 
        {
        day = 28;
        if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
            day++;
         }
             break;
    }
    return day;
}
int main()
{
    int m = 0;
    int y = 0;
    while (scanf("%d %d", &y, &m) == 2)
    {
        int ret = get_days_of_month(y, m);
        printf("%d\n", ret);
    }
    return  0;
}

方法二:

int get_days_of_month(int y, int m)
{
    int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    //                1  2  3  4  5  6  7  8  9  10 11 12
    int day = days[m];
    if ((m == 2) && (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)))
    {
        day++;
    }
    return day;
}

int main() {
    int y = 0;
    int m = 0;
    while (scanf("%d %d", &y, &m) == 2)
    {
        int ret = get_days_of_month(y, m);
        printf("%d\n", ret);
    }

    return 0;
}

这里有个细节补了一个0 ,将数组元素和月份就对应上了, 但是如果是闰年的话 ,二月要加一天。

题目三:输入NxM矩阵,矩阵元素均为整数,计算其中大于零的元素之和。
链接: https://www.nowcoder.com/practice/0c83231923c541d2aa15861571831ee5?tpId=107&&tqId=33371&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking


方法一:

#include <stdio.h>
int main ( )
{
    int m = 0;
    int sum = 0 ;
    int n =0;
    int arr[10] [10] = {0} ;
     scanf( "%d %d",&m , &n);
     int i = 0;
     for ( i =0 ; i <m ; i ++ )
     {
         int j =0 ;
         for ( j =0 ; j <n; j ++)
         {
      scanf ("%d",&arr[i] [j] ) ; 
             if ( arr [i] [j] >0)
         {
             sum+=arr[i] [j] ;
         }
         }
     
     }
     printf( "%d",sum );
    return 0 ;
}

采用遍历数组的方法(从头到尾,依次访问数组的每一个位置,获取每一个位置的元素)
方法二:

int main() {
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr[n][m];//变长数组
    int i = 0;
    int j = 0;
    int tmp = 0;
    int sum = 0;
    //输入
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            scanf("%d", &arr[i][j]);
        }
    }
    //计算
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            if (arr[i][j] > 0)
                sum += arr[i][j];
        }
    }
    //输出
    printf("%d\n", sum);
    return 0;
}

方法二

用到了变长数组 ,牛客网的oj是支持c99标准的,所以可以使用变长数组


题目:小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣。因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。
链接 https://www.nowcoder.com/practice/242eafef2a704c0ca130d563b7b3ee2d?tpId=107&&tqId=33392&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking


方法一:

int main()
{
	int i = 0;
	int arr[20] = { 0 };
	int n = 0;
	scanf("%d", &n);
	while (n )
	{
		arr[i++] = n % 6; // 4  1 
		n /= 6;   // 1
	}
	//遍历数组
	for (--i; i >= 0; i--)//反着打印 i=2 ,但是14的1 存在数组中的形式是arr[1] 14中的4存在数组中的形式是arr[0] 
	{
		printf("%d", arr[i]);
	}
	return 0;
}

假设一个数是10 那么10这么得到他的6进制(14) ?
10 % 6 —— 4 (14中的4)
10 / 6 —— 1
1 % 6 ——1 (14中的1 )
1 / 6 —— 0 结束循环


方法二:递归

  void Print(int n)
{ 
	  if (n > 5)
	  {
		  Print(n / 6);
	   }
	  printf("%d", n % 6);
}
int main()
{
 int n = 0;
	scanf("%d", &n);
	Print(n);
	return 0;
}

题目:第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
链接:https://www.nowcoder.com/practice/351b3d03e410496ab5a407b7ca3fd841?tpId=107&&tqId=33388&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking


方法一:

使用变长数组

int main() {
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr[n][m];
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    //打印
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ", arr[j][i]);
        }
        printf("\n");
    }
    return 0;
}

题目:有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1 \le n \le 501≤n≤50
链接:https://www.nowcoder.com/practice/7bbcdd2177a445a9b66da79512b32dd7?tpId=107&&tqId=33379&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking


方法一:

#include <stdio.h>
int main()
{
    int n= 0;
    scanf ("%d",&n);
    int arr[n] ;
    int i =0 ;
    for ( i=0 ; i <n ; i++)
    {
        scanf ( "%d",&arr[i]);
    }
    int del= 0;
    scanf("%d",&del);
    //找到要删除的值
    for ( i =0 ; i<n ;i ++)
    {
        if (arr[i] ==del)
        {
            arr[i] =0 ;
        }
    }
    //输出
    for ( i =0 ; i<n ; i ++)
    {
        if( arr[i] !=  0)
         {
             printf("%d " ,arr[i]);
         }
    }
    return 0 ;
}

题目:将一个字符串str的内容颠倒过来,并输出。

链接:https://www.nowcoder.com/questionTerminal/cc57022cb4194697ac30bcb566aeb47b


方法一:

 void reverse_string(char* str)
{
	int left = 0;
	int  right = strlen(str) - 1;

	while (left < right)
	{
		char tmp = *(str + left);
		*(str+left) = *(str + right);
		*(str + right) = tmp;
		left++;
		right--;
     }
}
int main()
{
	char  arr[1000] = { 0 };
	gets(arr);
	 reverse_string(arr);
	 printf("%s", arr);
	return 0;
}

方法二:

指针

reverse_string(char* str)
{
	char* left = str;
	char* right =str+strlen(str)-1;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
 }
int main()
{
	char arr[1000] = { 0 }; 
	gets(arr);
	reverse_string(arr);
	
	printf("%s", arr);
	return 0;
}

在这里插入图片描述


如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鄃鳕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值