#include<stdio.h>
int main()
{
int n = 0;
//输入
scanf("%d", &n);
//判断n是否为2的k次方
if ((n & (n - 1)) == 0)
{
printf("%d是2的k次方\n", n);
}
else
{
printf("%d不是2的k次方\n", n);
}
return 0;
}
2、获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
分析:
C语言刷题(1)
知识点:
1、想要获取一个数的每一位,我们的思想是把高位的数变成低位来获取,因为低位的数更容易获取
2、想得到一个数二进制的最低位的操作:n&1
3、二进制高位变低位:通常使用右移操作符
4、<<左移操作符
移位规则:
①左边抛弃,右边补0
5、>> 右移操作符
移位规则:
①(常见如VS)算术右移:左边补原来的符号位,右边抛弃
②逻辑右移:左边直接补0,右边抛弃
6、移位操作符虽然产生了二进制的移动,但是实际上变量n在没有被赋值的情况下,自身的值不会发生变化
代码实例:
#include<stdio.h>
//自定义函数——实现打印一个整数二进制序列中所有的偶数位和奇数位,分别打印
void print(int n)
{
//循环变量
int i = 0;
//提示
printf("奇数位:");
//打印二进制序列中所有奇数位
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
//换行
printf("\n");
//提示
printf("偶数位:");
//打印二进制序列中所有偶数
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
//换行
printf("\n");
}
int main()
{
int n = 0;
//输入
scanf("%d", &n);
//调用函数,打印n二进制序列中的奇数位和偶数位
print(n);
return 0;
}
3、求两个数二进制中不同位的个数
代码1:判断m和n的每一位是否不相等
分析:
C语言刷题(1)
#include<stdio.h>
//自定义函数——实现求两个数二进制中不同位的个数
int count_diff_one(int m, int n)
{
int count = 0;//计数器
int i = 0;//循环变量
//循环32次每一次判断m,n中是否不同位,不同位加1
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) != ((m >> i) & 1))
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
int m = 0;
//输入
scanf("%d %d", &n, &m);
//调用函数,求两个数二进制中不同位的个数
int ret = count_diff_one(m, n);
//输出不同位的个数
printf("%d\n", ret);
return 0;
}
运行结果:
C语言刷题(1)
代码2:借助异或操作符和tmp=tmp&(tmp-1)
分析:
C语言刷题(1)
#include<stdio.h>
//自定义函数——实现求两个数二进制中不同位的个数
int count_diff_one(int m, int n)
{
int count = 0;//计数器
int tmp = m ^ n;//运算规则:相同为0,相异为1
//统计tmp的二进制有几个1
while (tmp)
{
tmp = tmp & (tmp - 1);//执行一次,就会去掉tmp二进制中的一个1
count++;
}
return count;
}
int main()
{
int n = 0;
int m = 0;
//输入
scanf("%d %d", &n, &m);
//调用函数,求两个数二进制中不同位的个数
int ret = count_diff_one(m, n);
//输出不同位的个数
printf("%d\n", ret);
return 0;
}
4、BC117-小乐乐走台阶
小乐乐走台阶_牛客题霸_牛客网
点击题目链接,做题
代码1:递归
分析:
C语言刷题(1)
知识点:
1、什么是递归?
程序调用自身的编程技巧称为递归。(即一个函数在其定义中有直接或间接调用自身的一种方法)
2、递归的思想:
递归主要思考的方式在于:大事化小
3、递归的作用:
递归策略,只需少量的程序就可描述解题过程所需要的多次重复计算,大大减少了程序的代码量
4、递归的理解:
递归要分开理解:递--->递推,归--->回归。先递推再回归。
5、递归的两个必要条件:
①存在限制条件,当满足这个限制条件的时候,递归便不继续了(递归出口)
②每次递归调用之后越来越接近这个限制条件
6、递归与迭代,当递归存在如下问题时,优先用迭代:
①递归层次太深时,栈溢出程序会崩溃
②递归的过程中有很多计算在一直重复时,程序效率低
#include <stdio.h>
long int Fib(int n)
{
if (n <= 2)
{
return n;
}
else
{
return Fib(n - 1) + Fib(n - 2);
}
}
int main()
{
int n = 0;
//输入n
scanf("%d", &n);
//调用函数——递归实现有多少走法
long int ret = Fib(n);
//输出
printf("%d\n", ret);
return 0;
}
代码2:迭代
分析:
C语言刷题(1)
知识点:
1、迭代(非递归):循环就是一种迭代,迭代可以理解成循环。
long int Fib(int n)
{
int a = 1;
int b = 2;
long int sum = 0;
if (n <= 2)
{
sum = n;
}
for (int i = 3; i <= n; i++)
{
sum = a + b;
a = b;
b = sum;
}
return sum;
}
int main()
{
int n = 0;
//输入n
scanf("%d", &n);
//调用函数——迭代实现有多少走法
long int ret = Fib(n);
//输出
printf("%d\n", ret);
return 0;
}
int get_days_of_month(int year, int month)
{
int day = 0;
switch (month)
{
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 (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
day++;
}
}
default:
break;
}
return day;
}
int main()
{
int year = 0;
int month = 0;
//多组输入year,month
while ((scanf("%d %d", &year, &month)) == 2)
{
//调用函数——求这一年这个月有几天
int day = get_days_of_month(year, month);
//输出
printf("%d\n", day);
}
return 0;
}
代码2:数组存储月份的天数
分析:
C语言刷题(1)
知识点:数组的下标是从0开始的
int get_days_of_month(int year, int month)
{
int day = 0;
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
day = days[month];
if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
{
day++;
}
return day;
}
int main()
{
int year = 0;
int month = 0;
//多组输入year,month
while ((scanf("%d %d", &year, &month)) == 2)
{
//调用函数——求这一年这个月有几天
int day = get_days_of_month(year, month);
//输出
printf("%d\n", day);
}
return 0;
}