近期作业总结(函数,递归,二进制)

二分查找函数

写一个二分查找函数

功能:在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回-1。

int bin_search(int arr[], int left, int right, int key)
{
	int mid = 0;
	while (left <= right) {
		mid = (right + left) / 2;
		if (key<arr[mid]) {
			right = mid -1;
		}
		else if (key >arr[mid]) {
			left = mid +1;
		}
		else return -1;
	}
	
}

打印乘法口诀

void Mutitable(int N) {
	for (int i = 1; i <= N; i++) {
		for (int j = i; j <= i:j++) {
			printf("%d*%d=%d", i, j, i * j);
		}
		printf("\n");
	}
}

判断闰年

实现函数判断year是不是闰年

int is_leap_year(int year)
{
	if(((0 == year%4)&&(0!=year%100))||(0==year%400))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

判断素数

#include <stdio.h>
#include<math.h>

int is_prime(int n)
{
	int i = 0;
	for (i = 2; i <= sqrt(n); i++)
	{
		if (0 == n % i)
		{
			return 0;//如果被其中一个数整除,那么结束程序
		}
	}
	return 1;
}


int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++) {
		if (is_prime(i) == 1) {
			printf("%d ", i);
		}
	}
	return 0;
}

创建一个整形数组,完成对数组的操作

  1. 实现函数init() 初始化数组为全0
  2. 实现print()  打印数组的每个元素
  3. 实现reverse()  函数完成数组元素的逆置。
  4. void init(int arr[], int sz)
    {
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		arr[i] = 0;
    	}
    }
    void reverse(int arr[], int sz) 
    {
    	int left = 0;
    	int right = sz - 1;
    	while (left < right) {
    		int temp = arr[left];
    		arr[left] = arr[right];
    		arr[right] = temp;
    		left++;
    		right--;
    	}
    
    }

    统计二进制中1的个数

这个题有两种方法,下面我将逐一介绍他们,并分析利弊。

方法一:思路:我们将该数据%2,如果除尽,则证明最后一位数字为0,如果未除尽,则最后一位为1。如果是1,则count++。

int Num(int n)
{
	int count = 0;
	while (n) 
	{
		if (n % 2 == 1) {
			count++;
			n = n / 2;//判断完毕后,将n右移一位
		}
	}
	return count;
}

该方法有一些缺陷:进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。

方法二:

思路:一个int类型的数据,对应的二进制一共有32个比特位,可以采用位运算的方式一位一位的检测。

int Num(int n) {
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++) {
		if ((n >> i) & 1 == 1) {
			count++;
		}
		return count;
	}
}

优点:用位操作代替取模和除法运算,效率稍微比较高
  缺陷:不论是什么数据,循环都要执行32次

方法三:

用相邻的两个数据进行按位与运算。

我们观察9999:‭10 0111 0000 1111‬按位与下一位的情况:
第一次循环:n=9999   n=n&(n-1)=9999&9998= 9998
第二次循环:n=9998   n=n&(n-1)=9998&9997= 9996
第三次循环:n=9996   n=n&(n-1)=9996&9995= 9992
第四次循环:n=9992   n=n&(n-1)=9992&9991= 9984
第五次循环:n=9984   n=n&(n-1)=9984&9983= 9728
第六次循环:n=9728   n=n&(n-1)=9728&9727= 9216
第七次循环:n=9216   n=n&(n-1)=9216&9215= 8192
第八次循环:n=8192   n=n&(n-1)=8192&8191= 0

我们可以观察到,该数按位与下一位,有几个1就可以进行几次。据此,我们可以写出代码:

int NumberOf1(int n)
{
	int count = 0;
	while(n)
	{
		n = n&(n-1);
		count++;
	}
	return count;
}

求两个数二进制中不同位的个数

1. 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
2. 统计异或完成后结果的二进制比特位中有多少个1即可

int calc_diff_bit(int m, int n)
{
	int tmp = m^n;
	int count = 0;
	while(tmp)
	{
		tmp = tmp&(tmp-1);
		count++;
	}
	return count;
}

喝汽水问题

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。

这个题目,同样有两个解法。第一种方法,让我们画图来理解:

以五瓶汽水为例子,演示一下。

当换汽水不能再执行的条件,也就是 只剩下一个空瓶子的时候。同样的,我们可以总结出来规律:empty=money;(一开始空的罐子等于花了多少钱)total=total+empty/2;(换得的饮料总数等于花的钱除以一开始花钱买的加上用空罐子换取的,empty=empty/2+empty%2;(比如说5瓶,能换2瓶喝了,剩下就是喝了的2个剩的空瓶和没法换的1个空瓶)

方法一:

#include<stdio.h> 
int main()
{
	int money;
	scanf("%d", &money);
	int total = money; 
	int empty = money; 
	while (empty > 1) {
		total = total + empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("%d\n", total); 
	return 0;
}

还有一个方法,就是采取等差数列的求法:

方法二:

#include<stdio.h>
int main()
{
	int money;
	scanf("%d", money);
	int total;
	if (money <= 0)
	{
		printf("请喝西北风");
	}
	else {
		money = total * 2 - 1;
	}
	printf("%d", total);
	return 0;
}

打印菱形

我们可以将上半部分和下半部分分开打印,首先画出总表,观察规律:

上半部分共有7行

由此可以总结出:空格个数等于line-1-i,星号个数等于 2*i+1。

再看下半部分:

星号个数为(line-1-i)*2-1,空格个数为i+1。据此我们就可以打印出此题的代码:

#include<stdio.h>
int main()
{
	int line = 7;
	for (int i = 0; i < line; i++)//打印上半部分
	{
		for (int j = 0; j < line - 1 - i; j++)
		{
			printf(" ");
		}
		for (int j = 0; j < 2 * i + 1; j++) 
		{
			printf("*");
		}
		printf("\n");
	}
	for (int i = 0; i < line - 1; i++)
	{
		for (int j = 0; j < i + 1; j++)
		{
			printf(" ");
		}
		for (int j = 0; j < (line - 1 - i) * 2-1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;

}

打印奇数位和偶数位

打印水仙花数

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

要打印水仙花数,我们要知道位数,并且把要验证的每一位都取出来。

#include<stdio.h>
#include<math.h>
int main() {
	for (int i = 1; i <= 100000; i++)
	{
		int count = 0;
		int tmp = i;
		while (tmp != 0) {
			count++;
			tmp /= 10;
		}
		tmp = i;
		int sum = 0;
		while (tmp != 0) {
			sum += pow(tmp % 10, count);
			tmp /= 10;
		}
		if(i == sum) {
			printf("%d\n", i);
		}
	}
	return 0;
}

求和

求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,

例如:2+22+222+2222+22222

#include<stdio.h>
#include<math.h>
int main() {
	int n = 5;
	int a = 2;
	int tmp = 0;
	int sum = 0;
	for (int i = 0; i < n; i++) 
	{
		tmp = tmp * 10 + a;
		sum += tmp;
	}
	printf("%d",sum);
	return 0;
}

找只出现一次的数字

相同的数字异或都为0,0和任意数字异或都为其本身。据此,我们写出如下代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,2,1 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int sum = 0;
	for (int i = 0; i < len; i++)
	{
		sum ^= arr[i];
	}
	printf("%d", sum);
	return 0;
}

打印奇数位和偶数位 

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

只要末位&1,就能知道最后一位是0还是1,如果是1,那么得到的是1,反之,则为0。

偶数位,也就是最左边的数字,应该右移31位,最后一个偶数应该右移一位,所以限制条件应当是i>=2。

#include<stdio.h>
void function(int n)
{
	for (int i = 31; i >= 1; i-=2)//偶数位
	{
		printf("%d", (n >> i)&1);
	}
	printf("\n");
	for (int i = 30; i >= 0; i -= 2)//奇数位
	{
		printf("%d", (n >> i)&1);
	}
	printf("\n");
}
int main()
{
	function(9);
	return 0;
}

递归

斐波那契数列

#include<stdio.h>
int fabonacci(int n)
{
	if (n <= 1) return n;
	else return fabonacci(n - 1) + fabonacci(n - 2);
}
int main()
{
	int n = 10;
	printf("第%d个斐波那契数是%d", n, fabonacci(n));
	return 0;
}

递归实现n的k次方

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int fact(int n,int k)
{
	if (k==1) return n;
	else return n*fact(n,k-1);
}
int main()
{
	int n ;
	int k;
	printf("请输入n和k的值");
	scanf("%d %d", &n, &k);
	printf("%d", fact(n, k));
	return 0;
}

计算一个数的每位之和(递归实现)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int factsum(int n)
{
	if (n<10) return n;
	else return n%10+factsum(n/10);
}
int main()
{
	int n ;
	printf("请输入n");
	scanf("%d", &n);
	printf("%d", factsum(n));
	return 0;
}

递归方式实现打印一个整数的每一位

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void print(int n)
{
	if (n < 10) {
		printf("%d ", n);
	}
	else {
		print(n/10);
		printf("%d ", n % 10);
	}
}
int main()
{
	print(123);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/359401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Labview 图像处理系统设计

1. 总体主界面设计 前面板界面如下&#xff1a; 界面总共分为一个实时采集加拍照控制模块&#xff0c;两个图像显示模块&#xff08;实时图像显示和直方图显示&#xff09;以及三个图像处理模块 前面板中各模块具体功能及使用说明如下&#xff1a; 1.当实时按钮关闭时&#x…

代码随想录day15--二叉树的应用3

LeetCode110--平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a…

Kotlin快速入门系列8

Kotlin的泛型 与Java一样&#xff0c;Kotlin也提供泛型。泛型&#xff0c;即 "参数化类型"&#xff0c;将类型参数化&#xff0c;可以用在类&#xff0c;接口&#xff0c;方法上。可以为类型安全提供保证&#xff0c;消除类型强转的烦恼。声明泛型类的格式如下&…

《CSS3》田字网格背景(外实线内虚线)的实现

一、前言 记录一些有趣的CSS实现方式&#xff0c;总所周知&#xff0c;当一段效果可以通过CSS实现的时候&#xff0c;绝不使用Javascript来实现&#xff0c;因此记录一些有意思的CSS效果&#xff0c;一来是方便自己学习&#xff0c;另一来是方便以后在需要使用到的时候能快速找…

基于yolov2深度学习网络的视频手部检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 输入mp4格式的视频文件进行测试&#xff0c;视频格式为1080p30. 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................…

burp靶场--xss下篇【16-30】

burp靶场–xss下篇【16-30】 https://portswigger.net/web-security/all-labs#cross-site-scripting 实验16&#xff1a;允许使用一些 SVG 标记的反射型 XSS ### 实验要求&#xff1a; 该实验室有一个简单的反射型 XSS漏洞。该网站阻止了常见标签&#xff0c;但错过了一些 S…

win wsl2 Ubuntu-22.04 设置时间为国内时间

使用 wsl2 安装 Ubuntu-22.04 后 时间不正确&#xff0c;主要有两个原因 时区设置不正确&#xff0c;国内为京八区。 时区正确后&#xff0c;没有同步时间。&#xff08;大部分人容易忽略这一点&#xff09; Linux 默认情况下使用 UTC 格式作为标准时间格式&#xff0c;如果在…

云原生Kubernetes: Ubuntu 安装 K8S 1.23版本(单Master架构) 及故障恢复

目录 一、实验 1.环境 2.安装 Ubuntu 3.连接Ubuntu 4.master节点安装docker 5.node节点安装docker 6.master节点安装K8S 7.添加K8S工作节点 8.安装网络插件calico 9.故障 10.故障恢复 11.测试k8s网络和coredns 二、问题 1.Ubuntu如何修改镜像源 2.Ubuntu和Windo…

STM32F407移植OpenHarmony笔记3

接上一篇&#xff0c;搭建完环境&#xff0c;找个DEMO能跑&#xff0c;现在我准备尝试从0开始搬砖。 首先把/device和/vendor之前的代码全删除&#xff0c;这个时候用hb set命令看不到任何项目了。 /device目录是硬件设备目录&#xff0c;包括soc芯片厂商和board板级支持代码…

Qt 基础之QDataTime

Qt 基础之QDataTime 引言一、获取(设定)日期和时间二、时间戳三、时间计算 (重载运算符) 引言 QDataTime是Qt框架中用于处理日期和时间的类。它提供了操作和格式化日期、时间和日期时间组合的功能。QDataTime可以用于存储和检索日期和时间、比较日期和时间、对日期和时间执行算…

华为——NGFW Module安装在集群交换机上,二层双机负载分担部署,交换机重定向引流

NGFW Module安装在集群交换机上&#xff0c;二层双机负载分担部署&#xff0c;交换机重定向引流 业务需求 如图1所示&#xff0c;两台交换机集群组网&#xff0c;两块NGFW Module分别安装在两台交换机的1号槽位组成双机负载分担组网。NGFW Module工作在二层&#xff0c;也就是…

FileViewer纯前端预览项目Vue2 demo

FileViewer 项目Vue2 demo 本demo基于vue-clijsvue2.x构建&#xff0c;如果您需要vue3版本的demo&#xff0c;请前往main分支。 适用于Vue2 Webpack&#xff0c;本集成方法要求最低Webpack版本为5&#xff0c;也就是Vue Cli Service 5.0.0以上&#xff0c;当然&#xff0c;if…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-4 Document

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>Document</title> </head><body> <canvas id"cavsElem" width"400" height"600">您的浏览器不支持Canvas…

flutter module打包成framework引入原生工程

Flutter - 将 Flutter 集成到现有项目&#xff08;iOS - Framework篇&#xff09; 本篇文章大幅参考了 caijinglong 大佬的总结文章&#xff1a; 把flutter作为framework添加到已存在的iOS中[1] 用 Flutter 来开发&#xff0c;从来都不可能是新开的一个纯 Flutter 项目&#xf…

【LVGL源码移植环境搭建】

LVGL源码移植&环境搭建 ■ LVGL源码移植■ 下载LVGL源码■ 修改LVGL文件夹■■■■ 视频链接 Ubuntu模拟器环境建置 ■ LVGL源码移植 ■ 下载LVGL源码 LVGL源码 我们以选择v8.2.0为例&#xff0c;选择8.2.0下载 ■ 修改LVGL文件夹 1.我们只需要关注这5个文件即可&…

java常量和kotlin常量

在java中使用final声明常量在kotlin中使用const val声明常量 常量在编译为字节码后会直接把调用常量的地方直接替换为常量值&#xff0c;示例如下&#xff1a; public class ConstDemo {public static final String NAME "Even";private static final int ID 100…

PythonSSTI漏洞

一&#xff0c;python内置PYC反编译&#xff1a; pyc文件&#xff0c;就是python的代码生成的字节码文件&#xff0c;有些类似于Java中的.class文件&#xff0c;pyc文件可以经过本地python解释器进行运行&#xff0c;从而实现跨平台。 也就是说我们得到了.pyc文件&#xff0c;就…

Selenium 隐藏浏览器指纹特征的几种方式

我们使用 Selenium 对网页进行爬虫时&#xff0c;如果不做任何处理直接进行爬取&#xff0c;会导致很多特征是暴露的 对一些做了反爬的网站&#xff0c;做了特征检测&#xff0c;用来阻止一些恶意爬虫 本篇文章将介绍几种常用的隐藏浏览器指纹特征的方式 1. 直接爬取 目标对…

vector的相关概念及常用接口

vector的基本概念 功能&#xff1a; vector容器与数组非常类似&#xff0c;也称单端数组&#xff08;动态数组&#xff09; vector容器的内部结构图示&#xff1a; vector与普通数组之间的区别&#xff1a; vector可以动态扩展&#xff0c;而普通数组是静态空间&#xff0c…

STM32——ADC

STM32——ADC 1.ADC介绍 ADC是什么&#xff1f; 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器! ADC性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xf…