题目:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
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阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
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;
}
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!