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

二分查找函数

写一个二分查找函数

功能:在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回-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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】两种方法实现继承

JS继承-ES6-基于 class 实现继承 mdn 类 阮一峰 ES6-class mdn-super ES6中推出了class类,是用来创建对象的模板。 class可以看作是一个语法糖,它的绝大部分功能&#xff0c;ES5 都可以做到&#xff0c;新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已…

【pytest系列】- assert断言的使用

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【AI视野·今日Robot 机器人论文速览 第七十六期】Fri, 12 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 12 Jan 2024 Totally 12 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Topology-Driven Parallel Trajectory Optimization in Dynamic Environments Authors Oscar de Groot, Laura Ferranti, Dari…

WPOpenSocial实现WordPress的QQ登录

个人建站不可避免的需要自己搭建用户数据库的问题&#xff0c;可用户却往往因为注册繁琐而放弃浏览您的网站&#xff0c;由此可见&#xff0c;一个社交账号一键登录方式尤为重要。选择适合您网站需求的社交插件&#xff0c;可以提升用户互动&#xff0c;增加社交分享&#xff0…

分布式场景怎么Join

背景 最近在阅读查询优化器的论文&#xff0c;发现System R中对于Join操作的定义一般分为了两种&#xff0c;即嵌套循环、排序-合并联接。 考虑到我的领域是在处理分库分表或者其他的分区模式&#xff0c;这让我开始不由得联想我们怎么在分布式场景应用这个Join逻辑&#xff…

《Linux C编程实战》笔记:管道

从这节开始涉及进程间的通信&#xff0c;本节是管道。 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性&#xff0c;管道又称之为半双工管道。。管道的这一特点决定了其使用的局限性。 数据只能由一个进程流向另一个进程&#xff1b;如果要进行全双工通信…

计算机组成原理学习| Day1

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 计算机组成原理 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽≦)o .&#x…

分享4款不能错过的修改照片尺寸的软件!

在当今这个数字化时代&#xff0c;照片已经成为我们分享生活、表达观点的重要方式。但是&#xff0c;你是否曾遇到过这样的问题&#xff1a;一张精美的照片因为尺寸不合适而无法在朋友圈中展现出最佳效果&#xff1f;不用担心&#xff0c;今天我们就来聊聊那些可以帮助你轻松修…

获取鼠标点击图片时候的坐标,以及利用html 中的useMap 和area 实现图片固定位置的点击事件

一 编写原因 应项目要求&#xff0c;需要对图片的固定几个位置分别做一个点击事件&#xff0c;响应不同的操作&#xff0c;如下图&#xff0c;需要点击红色区域&#xff0c;弹出不同的提示框&#xff1a; 二 获取点击图片时候的坐标 1. 说明 实现这以上功能的前提是需要确定需…

JVM-类的生命周期

类的生命周期概述 类的生命周期描述了一个类加载、使用、卸载的整个过程。整体可以分为&#xff1a; 加载 连接&#xff0c;其中又分为验证、准备、解析三个子阶段 初始化 使用 卸载 加载阶段 加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方…

【JavaScript】fetch

fetch Response Headers ajax&axios&fetch的关系: ajax&#xff1a;ajax 是一种基于原生 JavaScript 的异步请求技术。它使用 XMLHttpRequest 对象来发送请求和接收响应。 axios&#xff1a;axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;可以在浏览器和 Node…

STM32——中断系统和外部中断EXTI

一、中断 1.1中断系统 中断系统是管理和执行中断的逻辑结构&#xff1b; 1.2中断 系统在执行主程序过程中&#xff0c;出现了特定的触发条件&#xff08;触发源&#xff09;&#xff0c;系统停止执行当前程序&#xff0c;转而去执行中断程序&#xff0c;执行完毕后&#xf…

什么是原型链?如何继承?

原型&#xff1a; 每个对象都可以有一个原型_proto_&#xff0c;这个原型还可以有它自己的原型&#xff0c;以此类推&#xff0c;形成一个原型链。查找特定属性的时候&#xff0c;我们先去这个对象里去找&#xff0c;如果没有的话就去它的原型对象里面去&#xff0c;如果还是没…

OllyDebug的使用方法. IDA Pro分析程序的控制流图,可以找到不同的函数入口点. 在汇编代码中定位特定函数可能是一个耗时且复杂的过程

实战 “OllyDbg” 是一个流行的Windows平台上的汇编级调试器&#xff0c;用于调试和分析二进制程序&#xff0c;尤其是用于逆向工程目的。使用OllyDbg的基本步骤如下&#xff1a; 安装和打开OllyDbg&#xff1a;首先&#xff0c;您需要在您的计算机上安装OllyDbg。完成安装后&…

HCIA学习作业五

拓扑图&#xff1a; PC端 PC1>ipconfig PC2>ipconfig PC3>ipconfig PC4>ipconfig PC>ping PC1>ping 192.168.1.125 PC1>ping 192.168.1.254 PC1>ping 192.168.1.253 PC2>ping 192.168.1.125 PC2>ping 192.168.1.253 PC3>ping 192.168.1.126…

java程序员怎么完善自己各个方面的能力?

java程序员怎么完善自己各个方面的能力? 在开始前我分享下我的经历&#xff0c;刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;两年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些java学习方法和资料&#xff0c;让我不断提升自己&#xff0c;感谢帮助…

Python计算机二级/Python期末考试 刷题(一)

收集了一些经典Python计算机二级和Python期末考试题库 整理不易&#xff0c;大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 目录 一、填空 二、选择 三、程序设计 一、填空 1.序列元素的编号称为索引&#xff0c;索引值从【1】开始&#xff0c;访问序列元素时将…

vue 使用 v-viewer 用于图片浏览的Vue组件,支持旋转、缩放、翻转等操作,基于viewer.js。

作者连接 npm&#xff1a; npm install v-viewerlegacy viewerjs main.js 引入&#xff1a; // 引入Viewer插件 import VueViewer, { directive as viewerDirective } from v-viewer; // 引入Viewer插件的图片预览器的样式 import viewerjs/dist/viewer.css; // 使用Viewer图片…

Pull模式和Push模式

Pull模式是一种消息消费模式&#xff0c;其中客户端主动从服务端拉取数据。 优点&#xff1a;客户端可以根据自己的消费能力来消费数据&#xff0c;不存在消息堆积的情况。 缺点&#xff1a;消息处理可能不及时&#xff0c;可能存在大量无效请求&#xff0c;客户端需要考虑拉取…

python对图片或文件的操作

一. base64 与图片的相互转换 1. base64 转图片 import base64 from io import BytesIO from PIL import Image# base64 编码的图像数据&#xff08;示例&#xff09; base64_data "iVBn9DHASKJDjDsdSADSf8lgg"# 将 base64 编码的字符串解码为二进制数据 binary_d…