组合数素数判定++和* *t=*afor循环你真的门儿清吗救济金发放

news2025/1/11 8:37:18

目录

P63_习题4-1_组合数

为什么m = n-m

P64_习题4-3_素数判定

为什么要floor

到底为什么判断到sqrt(n)即可

++和*

 *t=*a

for循环你真的门儿清吗

为什么要把较大的数组放在main函数外

P82_eg4-3_救济金发放_UVa133


P63_习题4-1_组合数

 防止溢出,又因为m <= n,所以用n!/m!=(m+1) (m+2)…(n-1)n

long long C(int n, int m) {
 if(m < n-m) m = n-m;
 long long ans = 1;
 for(int i = m+1; i <= n; i++) ans *= i;
 for(int i = 1; i <= n-m; i++) ans /= i;
 return ans;
}

为什么m = n-m

然后还要知道到底为什么要把n!/m!给约分。因为我们这里,n肯定是最大的数,要防止n!的溢出。约分之后这个值就变成了从m+1到n的累乘。

而我们知道 

这是一件好事。着说明我们可以把m的值变成我们想要的。

我们需要从m+1到n的累乘,那一定是m越大计算的次数就越小。

那么,这个小和大怎么来分辨呢。就是用if(m < n-m)。

P64_习题4-3_素数判定

素数判定。编写函数,参数是一个正整数n,如果它是素数,返回1,否则返回0。

int isPrime(int n){
	if(n == 1) return 0;
	for(int i = 2;i <= sqrt(n);i++){
		if(n % i == 0) return 0;
	}
	return 1;
}
int is_prime(int n)
{
 if(n == 1) return 0;
 int m = floor(sqrt(n) + 0.5);
 for(int i = 2; i <= m; i++)
 if(n % i == 0) return 0;
 return 1;
}

为什么要floor

 

到底为什么判断到sqrt(n)即可

仔细思考就会发现,其实数字x的因数分成两大部分,一部分是小于x的平方根,另外一部分大于x的平方根,小于平方根和大于平方根的部分是一一对应的,因而可以只判断从2到平方根的数字是否都能被整除即可。

++和*

 *t=*a

void swap(int* a, int* b)
{
 int *t;
 *t = *a; *a = *b; *b = *t;
}

这个程序错在哪里?t是一个指向int型的指针,因此*t是一个整数。用一个整数作为辅助 变量去交换两个整数有何不妥?事实上,如果用这个函数去替换程序4-6,很可能会得到“4 3”的正确结果。为什么笔者要坚持说它是错误的呢? 问题在于,t存储的地址是什么?也就是说t指向哪里?因为t是一个变量(指针也是一个 变量,只不过类型是“指针”),所以根据规则,它在赋值之前是不确定的。如果这个“不确 定的值”所代表的内存单元恰好是能写入的,那么这段程序将正常工作;但如果它是只读 的,程序可能会崩溃。读者可尝试赋初值int *t = 0,看看内存地址“0”能不能写。

for循环你真的门儿清吗

for循环中的最后一个语句是最后执行的,也就是说无论写成先自加还是后自加都是一个效果

为什么要把较大的数组放在main函数外

局部变量也是放在堆栈段的。栈溢出不一定是递归调用太多,也可能是 局部变量太大。只要总大小超过了允许的范围,就会产生栈溢出。

P82_eg4-3_救济金发放_UVa133

n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开
  始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个
  官员停在同一个人上)。接下来被官员选中的人(1个或者2个)离开队伍。输入n,k,m
  输出每轮里被选中的人的编号(如果有两个人,先输出被A选中的)。例
  如,n=10,k=4,m=3,输出为4 8, 9 5, 3 1, 2 6, 10, 7。注意:输出的每个数应当恰好占3列。
  【分析】
  仍然采用自顶向下的方法编写程序。用一个数组表示人站成的圈。为了避免
  人走之后移动数组元素,用0表示离开队伍的人,数数时跳过即可。
  
  注意go这个函数。
  当然也可以写两个函数:逆时针go和顺时针go,但是仔细思考后发现这两个函数可以合并:
  逆时针和顺时针数数的唯一区别只是下标是加1还是减1。把这个+1/-
  1抽象为“步长”参数,就可以把两个go统一了

#include<stdio.h>
#define maxn 25
int n, k, m, a[maxn];
//逆时针走t步,步长是d(-1表示顺时针走),返回新位置

int go(int p, int d, int t) {
	while(t--) {
		do { p = (p+d + n-1) % n + 1; } while(a[p] == 0); //走到下一个非0数字
	}
	return p;
}

int main() {
	while(scanf("%d%d%d", &n, &k, &m) == 3 && n) {
		for(int i = 1; i <= n; i++) a[i] = i;
		int left = n; //还剩下的人数
		
		int p1 = n, p2 = 1;//p1为A,-1是顺时针
		while(left) {
			p1 = go(p1, 1, k);
			p2 = go(p2, -1, m);
			printf("%3d", p1); left--;
			if(p2 != p1) { printf("%3d", p2); left--; }
			a[p1] = a[p2] = 0;
			if(left) printf(",");
		}
		printf("\n");
	} 
	return 0;
}

注意go这个函数。当然也可以写两个函数:逆时针go和顺时针go,但是仔细思考后发现这两个函数可以合并:逆时针和顺时针数数的唯一区别只是下标是加1还是减1。把这个+1/- 1抽象为“步长”参数,就可以把两个go统一了。

int go(int p, int d, int t) {
	while(t--) {
		do { p = (p+d + n-1) % n + 1; } while(a[p] == 0); //走到下一个非0数字
	}
	return p;
}

感觉本题最难的地方就是这个go函数。作者的抽象能力确实很强,能把两件事(逆时针和顺时针)抽象出一个模型然后统一写在一个函数中。

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

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

相关文章

【JavaScript】module let Object.setPrototypeOf()以及箭头函数

案例&#xff1a;选项卡 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

python 3 添加环境变量后 仍然无法用cmd输入python访问,而是弹出应用商店 | 两种解决方法

问题描述 今天重装python3.10后发现即使正确添加环境变量时&#xff0c;仍然无法用cmd输入python或python3访问&#xff0c;而是弹出应用商店。但是如果输入cmd里输入py是可以运行的&#xff08;证明python是正常安装好的&#xff09;。 这里给出两种解决方法&#xff0c;一种…

指针进阶(详解)

指针进阶一.字符指针二.指针数组1.一次打印多个字符串2.模拟二维数组三.数组指针1.定义2.应用四.函数指针五.函数指针数组六.指向函数指针数组的指针七.回调函数在开始这篇之前&#xff0c;前面有两篇指针初阶&#xff0c;如果需要的话可以去看看哟&#xff01;指针初阶1&#…

网络安全等级保护确定定级对象

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 网络安全等级保护确定定级对象 信息系统 定级对象的基本特征 作为定级对象的信息系统应具有如下基本特征&#xff1a; 具有确定的主要安全责任主体&#xff1…

【MySQL进阶教程】SQL优化

前言 本文为 【MySQL进阶教程】SQL优化 相关知识&#xff0c;下边将对主键优化&#xff0c;order by优化&#xff0c;group by优化&#xff0c;limit优化&#xff0c;count优化&#xff0c;update优化等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &am…

利用Python为女神制作一个专属网站

快跟随小编一起学习一下如何利用Python语言制作一个专属的网站送给女神吧&#xff01; 如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多支持呀&#xff01;关注、点赞、收藏、评论。 目录如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多…

1995-2019年全球清廉指数

1995-2019年全球清廉指数 1、时间&#xff1a;1995-2019年 2、来源&#xff1a;透明国际&#xff08;Transparency International&#xff09; 3、区域&#xff1a;全球170多个国家 4、指标说明&#xff1a; 清廉指数&#xff08;Corruption Perceptions Index&#xff0c…

【自学C++】C++ short

C short C short教程 C 中的 short 用来表示一个 整数&#xff0c;也可以叫做短整型&#xff0c;如果我们需要表示的整数比较小&#xff0c;那么我们可以使用 short 来定义&#xff0c;这样可以节省系统资源。 C short定义详解 语法 short int varname value; short varn…

【django】关联模型类中数据的增删改查操作总结

文章目录一、多对一正向操作1、改方法一方法二2、删3、查反向操作案例1&#xff1a;查询百度渠道下的所有学生信息案例2&#xff1a;新增一个百度渠道下的学生1、增直接创建Student对象2、改方法一&#xff1a;add()案例1&#xff1a;将s1,s2,s3添加到百度渠道中方法二:替换对象…

【Java】遨游在多线程的知识体系中(二)

前言&#xff1a;一、分析上篇多线程不安全原因1. count 操作是三个步骤&#xff0c;load add save2. 多个线程之间的调度是无序的&#xff0c;两个线程的上述三个操作可能存在多种不同的相对顺序3. 线程针对变量的修改不是原子的4. 内存可见性5.指令重排序二、synchronize 关键…

Java中clone的浅拷贝和深拷贝区别以及方法详解

克隆定义 在 Java 中&#xff0c;克隆是创建原始对象的精确副本的过程。它本质上意味着能够创建一个与原始对象具有相似状态的对象。 复制对象&#xff0c;首先要分配一个和源对象同样大小的空间&#xff0c;在这个空间中创建一个新的对象。 new对象和clone区别 使用new操作符创…

Python批量采集无水印短视频内容

前言 短视频流行起来可不是一年两年了&#xff0c;现在很多年轻人都在玩短视频&#xff0c;有些的单纯就是看看&#xff0c;而有些的就是自己发视频 我每天刷视频&#xff0c;一刷就停不下来&#xff0c;应该还是有蛮多人跟我一样的吧 那有没有想法用自己所学的python知识&a…

Linux管道——进程间通信(匿名管道、命名管道)

文章目录一、进程间通信1.1 进程间通信的概念1.2 进程间通信的目的1.3 进程间通信的本质1.4 进程间通信的分类二、管道2.1 匿名管道① 匿名管道的使用场景② 匿名管道实现通信的原理③ 创建匿名管道 pipe函数④ fork共享管道⑤ 匿名管道的五个特点⑥ 匿名管道的四种特殊情况2.2…

开发模型和测试模型,考点归纳,你都记住了吗?

目录 前言 一、开发模型 1.1、瀑布模型 1.2、螺旋模型 1.3、迭代模型和增量模型 1.4、敏捷模型 敏捷开发最流行的方式——scrum模型 二、测试模型 2.1、V模型 2.2、W模型&#xff08;双V模型&#xff09; 前言 对于模型&#xff0c;需要重点掌握特点&#xff0c;缺点&…

模板编程:constexpr +特例化 判断质数

重点&#xff1a; 1.constexpr 函数支持在编译期间完成计算 2.特例化是模板中一种定义 using namespace std;//编译期进行判断 constexpr bool isPrime(unsigned int p) {for (unsigned int d2;d<p/2;d){if (p % d 0){return false;}}return p > 1; }template<int…

python爬虫入门

基础知识 HTTP协议 我们浏览网页的浏览器和手机应用客户端与服务器通信几乎都是基于HTTP协议&#xff0c;而爬虫可以看作是一个另类的客户端&#xff0c;它把自己伪装成浏览器或者手机应用客户端&#xff0c;按照自己的逻辑贪婪的向服务器索取数据&#xff0c;如何向服务器索…

【实操篇】Linux的网络环境及其配置

目录 ●Linux网络环境原理图&#xff08;NAT模式&#xff09; ●虚拟网络编辑器对虚拟网卡ip进行修改&#xff08;VMnet-&#xff09; ●查看网关( VMnet8->WLAN) ●Linux网络ip配置 1.修改配置文件去获取固定ip 2.自动获取ip连接网络 ●Linux网络环境原理图&#xff…

【vue2】计算属性(computed)与侦听器(watch)详解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;计算属性与侦听属性的用法 目录&#xff08;文末有给大家准备好的Xmind思维导图&#xf…

JAVA单商户商城系统源码,前(vue)后(SpringBoot)端分离,支持多平台(h5,小程序,app)

前言 完整代码下载地址&#xff1a;JAVA单商户商城系统源码 linjiashop 是一个基于Spring Boot和Vue.js的web商城系统 linjiashop 包含了商城的后台管理系统,手机h5&#xff0c;小程序版本 linjiashop 采用web-flash作为底层基础框架搭建&#xff0c;开发过程遇到问题请多阅…

Js中闭包的概念和具体使用

前言闭包在js里面是一个比较抽象的概念,但在面试里,是一个必问的话题,往往面试官希望你列举一些使用闭包的例子或手写一个闭包闭包,简单一句话讲就是能够读取其他函数内部变量的函数,当需要函数内容部的变量被外部的代码所访问时那闭包就非常有用了的,如今,很多框架里面的高级特…