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

二分查找函数

写一个二分查找函数

功能:在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回-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,一经查实,立即删除!

相关文章

【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…

《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)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方…

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

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

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;感谢帮助…

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图片…

【C++】类与对象(二)特殊成员函数

前言 类与对象&#xff08;二&#xff09; 文章目录 一、特殊成员函数二、构造函数三、析构函数四、拷贝构造函数五、拷贝赋值运算符 一、特殊成员函数 如果在类的声明中未显式提供某个成员函数的定义&#xff0c;编译器会自动生成一个默认实现。 这包括默认构造函数、默认析构…

Android studio打包apk比较大

1.遇到的问题 在集成linphone打包时发现有118m&#xff0c;为什么如此之大额。用studio打开后发现都是c不同的pu架构。 2.解决办法 增加ndk配置&#xff0c;不选配置那么多的cpu结构&#xff0c;根据自己需要调整。 defaultConfig { applicationId "com.matt.linphoneca…

备战蓝桥杯---数据结构与STL应用(基础3)

今天我们主要介绍的是pair,string,set,map pair:我们可以把它当作一个结构体&#xff1a; void solve(){pair<int int> a;//创建amake_pair(1,2);//添加元素cout<<a.first<<endl<<a.second<<endl;}//输出 当然&#xff0c;它也可以嵌套&#…

python笔记10

1、继承 继承是面向对象编程中的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用父类的代码&#xff0c;并且有机会添加新的属性和方法&#xff0c;或者重写父类的…

使用PowerBI 基于Adventure Works案例分析

Adventure Works案例分析 前言 数据时代来临&#xff0c;但一个人要顺应时代的发展是真理。 数据分析的核心要素 那数分到底是什么&#xff1f; 显然DT 并不等同于 IT&#xff0c;我们需要的不仅仅是更快的服务器、更多的数据、更好用的工具。这些都是重要的组成部分&…

堆宝塔

L2-1 堆宝塔 分数 25 作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明…

AI特训一:为什么要学习AI

我们先了解什么是AI AI&#xff08;人工智能&#xff09;是指计算机系统经过学习和推理能够模拟人类智能行为的一种技术。AI利用机器学习、深度学习、自然语言处理等技术&#xff0c;能够分析大量的数据、识别模式、做出决策和预测 AI有哪些强大之处 处理大量数据&#xff1a…

专栏:数据库、中间件的监控一网打尽

前言 对于数据库、中间件的监控&#xff0c;目前社区里最为完善的就是 Prometheus 生态的各个 Exporter&#xff0c;不过这些 Exporter 比较分散&#xff0c;不好管理&#xff0c;如果有很多目标实例需要监控&#xff0c;就要部署很多个 Exporter&#xff0c;要是能有一个大一…