gcd

iOS多线程编程之三——GCD的应用

你说的曾经没有我的故事 提交于 2019-12-04 19:02:42
iOS多线程编程之三——GCD的应用 一、引言 在软件开发中使用多线程可以大大的提升用户体验度,增加工作效率。iOS系统中提供了多种分线程编程的方法,在前两篇博客都有提及: NSThread类进行多线程编程: http://my.oschina.net/u/2340880/blog/416524 。 NSOperation进行多线程操作编程: http://my.oschina.net/u/2340880/blog/416782 。 上两个进行多线程编程的机制都是封装于Object-C的类与方法。这篇博客将讨论的 Grand Central Dispatch(GCD)机制,则是基于C语言的,相比上面两种机制,GCD更加高效,并且线程有系统管理,会自动运用多核运算。因为这些优势,GCD是apple推荐我们使用的多线程解决方案。 二、GCD的调度机制 GCD机制中一个很重要的概念是调度队列,我们对线程的操作实际上是由调度队列完成的。我们只需要将要执行的任务添加到合适的调度队列中即可。 1、调度队列的类型 调度队列有三种类型: (1)主队列 其中的任务在主线程中执行,因为其会阻塞主线程,所以这是一个串行的队列。可以通过 dispatch_get_main_queue ()方法得到。 (2)全局并行队列 队列中任务的执行方式是严格按照先进先出的模式进行了。如果是串行的队列

欧拉函数的应用(2)——欧拉函数与欧拉定理的结合

社会主义新天地 提交于 2019-12-04 15:53:48
例题一:The Luckiest number(pku 3696) 中国人喜欢的数字是6,8,9.Bob也一样,他喜欢的数字是8.Bob的幸运数字为能整除L的全8序列的最短长度。现在的任务就是找到Bob的幸运数字,如果不能找到,则输出0. 如果L=1,则幸运数字应该是一,因为8只能整除一;同理,当L=2时,幸运数字同样是一。 输入:输入数据有多组,每组占一行,每组测试数据输入一个L(1<=L<=2 000 0000 000).当L=0时,输入结束。 输出:对应每组输入数据输出占一行,输出格式为:测试数据的编号(从1开始),Bob的幸运数字。具体见样例。 Sample Input 8 11 16 0 Sample Output Case 1: 1 Case 2: 2 Case 3: 0 分析:题意,给一个数N(1<=N<=2000000000);问是否存在N的倍数M,且M的各个位全部由8组成,如果存在多个取最小的M并输出M由几个8组成。 解题思路:因为M全部由8组成,即M=(10^x -1)*8/9=k*N; 则 (10^x-1)*8/gcd(8,N)=9*k*N/gcd(8,N); 令p=8/gcd(8,N); q=9*N/gcd(8,N); 即 (10^x-1)*p=k*q; 由于p和q互质( 因为8/gcd(8,N)与N/gcd(8,N)互质 ) ,则(10^x-1)%q==0

poj 3696 &&hdoj 2462 The Luckiest number(同余&欧拉) 好题

a 夏天 提交于 2019-12-04 15:44:58
The Luckiest number Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4839 Accepted: 1293 Description Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own lucky number L . Now he wants to construct his luckiest number which is the minimum among all positive integers that are a multiple of L and consist of only digit '8'. Input The input consists of multiple test cases. Each test case contains exactly one line containing L (1 ≤ L ≤ 2,000,000,000). The last test case is followed by a line containing a zero. Output For each test case, print

POJ 3696

半城伤御伤魂 提交于 2019-12-04 15:42:33
题目连接: The Luckiest number 题意:求出由全8组成的数的最短长度,使得给定的L能整除它。 分析:先分析公式,可以发现一个全由A组成的数的表示形式为: ,所以全8组成的数为: 。 L能整除它,则有: ,亦即: ,则应该先约去8与9L的最大公约数。 因为8与9互素,所以实际上就是约去8与L的最大公约数。 所以进一步有: 。 设gcd(a,m)=1,必有正整数x,使得a^x=1(mod m),且设满足等式的最小正整数为x0,必满足x0|phi(m).注意m>1. 否则如果gcd(a,m)!=1,则方程a^x=1(mod m)没有解。 个人补充: ∵ 8*(10^x - 1 ) / 9 能整除 L 假设 8*(10^x - 1 ) / (9*L) == p ( p 为整数) ∴ 8*(10^x - 1 ) == 9*p*L ==》 8*(10^x - 1 ) =0 mod(9*L) ∵ 8*(10^x - 1 ) == 9*p*L 两边同时约去 gcd(8,L) 得到 p1*(10^x - 1) == 9*p*L/gcd(8,L) ∴ 10^x - 1 == 9*k*L / gcd(8,L) 其中,k = p / p1 于是有 还有另一种思路: #include<iostream> #include<cstdio> #include<cstring> #include

POJ3696

天大地大妈咪最大 提交于 2019-12-04 15:42:08
P O J 3696 POJ3696 P O J 3 6 9 6 题目 POJ3696 题意 分析 x x x 个 8 8 8 连在一起组成的正整数可写作 8 ( 1 0 x − 1 ) 9 {\frac{8{(10^x-1)}}{9}} 9 8 ( 1 0 x − 1 ) ​ ,把题目的问题转化为:求一个最小的 x x x ,满足 L ∣ 8 ( 1 0 x − 1 ) / 9 L|8(10^x-1)/9 L ∣ 8 ( 1 0 x − 1 ) / 9 . 前提: g c d ( a c , b c ) = c gcd(ac,bc) = c g c d ( a c , b c ) = c ⇒ \Rightarrow ⇒ g c d ( a , b ) = 1 gcd(a,b) = 1 g c d ( a , b ) = 1 g c d ( a c g c d ( a c , b c ) , b c g c d ( a c , b c ) ) = 1 gcd({\frac{ac}{gcd(ac,bc)}},{\frac{bc}{gcd(ac,bc)}}) = 1 g c d ( g c d ( a c , b c ) a c ​ , g c d ( a c , b c ) b c ​ ) = 1 即:正整数 x , y x,y x , y 的最大公约数不为 1 1 1 时

辗转相除法

隐身守侯 提交于 2019-12-04 01:27:13
算法说明: 其计算原理依赖于下面的定理: 两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。 最大公约数(greatest common divisor)缩写为gcd。 gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0),以此辗转相除得到最终结果。 网上链接: https://www.cnblogs.com/Dragon5/p/6401596.html 伪代码如下: while (b!=0) { if (a>b) a=a%b; else b=b%a; } 结果是b+a 测试: 来源: https://www.cnblogs.com/lhpshuaibi/p/11826941.html

GCD 信号量控制并发 (dispatch_semaphore)

邮差的信 提交于 2019-12-03 16:28:30
当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是 dispatch_semaphore ,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。   信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。   在GCD中有三个函数是semaphore的操作,分别是:   dispatch_semaphore_create   创建一个semaphore   dispatch_semaphore_signal   发送一个信号   dispatch_semaphore_wait    等待信号    简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信 号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让 信号总量-1,根据这样的原理

iOS笔记(一)GCD多线程:信号量和条件锁

纵饮孤独 提交于 2019-12-03 16:27:49
1.信号量 dispatch_semaphore_t 在NSOperation中,可以直接设置最大并发数来控制并发数量,在GCD中,控制并发数量由信号量来完成。 信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。   在GCD中有三个函数是semaphore的操作,分别是:   dispatch_semaphore_create   创建一个semaphore   dispatch_semaphore_signal   发送一个信号   dispatch_semaphore_wait    等待信号   简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。 //信号量:整数值,最多有10个线程并发 dispatch_semaphore_t semaphore = dispatch

iOS multiple threads(2)------GCD

倖福魔咒の 提交于 2019-12-03 15:03:27
前面一二也说过, iOS中多线程编程工具主要有: NSThread NSOperation GCD 这三种方法都简单易用,各有千秋. 同NSThread相比,GCD的运行效率更高,开发更简单。 但GCD确是诱惑力的,因为其本身是apple为多核的并行运算提出的解决方案.虽然当前移动平台用双核的不多,但不影响GCD作为多线程编程的利器(新一代的apple设备已经是双核了 ) 概述 iOS中,concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单。它把任务分派到不同的queue队列来处理。开发者把任务代码装到一个个block里面,操作系统把这些任务代码分派到不同的资源 里去处理,一个简单的例子来说,为什么初学者写tableview的时候,滑动列表时总会很卡,因为很多初学者把图片装载放到main thread主线程去执行,例如我们要滑动畅顺的话,iOS最快可以1秒内刷新60次,如何你的一个cell的文字和图片装载超过1/60秒的话,自然就 会卡。所以一般我们会把图片装载这些需要多点时间的移出main thread来处理,对于用GCD来说,就是把图片载入放到另外一个queue队列中来异步执行,当资源准备好了后,放回到main thread中显示出来。main thread在GCD中就是main queue。

求最大公约数的欧几里得算法与其伪代码

為{幸葍}努か 提交于 2019-12-03 11:49:44
最大公约数的欧几里得算法 a,b最大公约数(Greatest Common Divisor),就等于b,a%b的最大公约数,公式如下 gcd(a,b)=gcd(b,a%b) gcd(a,b) = gcd(b,a % b) gcd(a,b)=gcd(b,a%b) 摘自 欧几里得算法(求解最大公约数的优质方法)以及原理拓展 用伪代码实现此算法 Begin 输入 A,B A对B取余,结果赋值为R 若R=0,则B是最大公约数 若R不等于0,则以B为A,以R为B循环上一步 手动检测运算截图 来源: https://www.cnblogs.com/ruier/p/11794829.html