特殊数求解(最大公约数/最小公倍数/素数)

1.最大公约数(GCD)

(1)如果a,b全为0,GCD不存在

(2)如果a、b其中之一为0,则GCD为a、b中非零的那个

(3)如果a、b都不为0,则使新的a=b,b=a%b,然后重复过程。

非递归

int gcd(int a, int b){
    while (b != 0){
        int t = a%b;
        a = b;
        b = t;
    }
    return a;
}

递归

int gcd(int a,int b){
    return b!=0?gcd(b,a%b):a;
}

2.最小公倍数(LCM)

最小公倍数为两数的乘积除以它们的最大公约数

3.素数筛法

判断一个数n是否为素数:测试大于1,小于sqrt(n)+1的数是否能整除n

bool judge(int a){
    if (a <= 1) return false;
    else{
        int b = (int)sqrt(a) + 1;
        for (int i = 2; i < b; i++){
            if (a%i == 0)
                return false;
        }
    }
    return true;
}

列举出某个范围内所有的素数(注意要求的是素数个数或者是整数范围)

将所有素数标记为1,飞素数标记为0

void ini(){
    for (int z = 0; z < 104780; z++)
        a1040[z] = 1;
    a1040[0] = 0;
    a1040[1] = 0;
    for (int i=2; i < 104780; i++){
        for (int j = 2; j < ((int)sqrt(i) + 1); j++){
            if (i % j == 0){
                a1040[i] = 0;
                //printf("%d", i);
            }
        }
    }
}

将标记为1的素数存放在一个新的数组里面

ini();
    int num[10001];
    int c = 1;
    for (int z = 0; z < 104780; z++){
        if (a1040[z] == 1)
            num[c++] = z;
    }

(注意时间的限定,如果要求的是素数的个数,要尽量将范围压缩,否则容易超时)

例题:

时间: 2024-10-28 06:44:14

特殊数求解(最大公约数/最小公倍数/素数)的相关文章

12--c完数/最大公约数/最小公倍数/素数/回文数

完数/最大公约数/最小公倍数/素数/回文数 2015-04-08 10:33 296人阅读 评论(0) 收藏 举报  分类: C/C++(60)  哈尔滨工业大学(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 1.一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). [cpp] view plain copy #include <stdio.h> #include <math.h

Num 19: 最大公约数.最小公倍数.素数的判断

在c语言的学习之中,经常会碰到: 计算最大公约数,最小公倍数和素数判断的问题: 在这里由浅入深总结一下: 1. 最大公约数与最小公倍数 : 由数学知识我们知道:       两个数的最小公倍数 = 这两个数的乘积 / 两个数的最大公约数:    所以求最大公约数和最小公倍数的问题其实是一类问题:  ①.最小公倍数:      方法一:        若 x>y ,从 x开始,判断x能否被y整除(x%y==0):        若能够整除,x既为最小公倍数:        若不能整除,计算2x,3

求解最大公约数和最小公倍数问题

思路: 最大公约数问题也是一个非常典型的递归算法的应用.每次递归使得原来求两个大数之间的公约数转变成求两个稍微小点的数之间的公约数,要求转换的过程要保证不会改变公约数的值.这就要看其中转换的原理了. 原理从<几何原本>中得出--辗转相除.假设f(x, y) 表示x,y的最大公约数是g,而k = x/y,b= x%y,则g必能整出b.因为x = ky + b,b = x - ky,b/g = (x-ky)/g一定为整数,所以必有g整除b. 如下所示: f(42, 30) = f(30, 12)

【编程珠玑】【第二章】编程求解最大公约数和最小公倍数

一.简介 两个整数的最大公约数是能够同时整除它们的最大的正整数.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数.例如,252和105的最大公约数是21(252 = 21 × 12:105 = 21 × 5),因为252 ÷105 = 2......42,所以(105,42)是21.在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零.这时的除数就是所求的两个数的最大公约数. 由辗转相除法也可以推出,两数的最大公约数可以用

两数的最大公约数、最小公倍数

几个整数,公有的约数,叫做这几个数的公约数:其中最大的一个,叫做这几个数的最大公约数.例如:12.16的公约数有±1.±2.±4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16) = 4.12.15.18的最大公约数是3,记为(12,15,18) = 3.    几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个自然数,叫做这几个数的最小公倍数.例如:4的倍数有±4.±8.±12.±16,--,6的倍数有±6.±12.±18.±24,--,4和6的公倍数有±12.±

hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)暨2015暑期多校赛第10场

题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结果(mod 1e9+7). 感觉蛮变态的,从比赛开始我就是写的这道题,比赛结束还是没写出来…… 期间找到了逆元,最小公倍数,组合数的各种公式,但是爆了一下午tle. 比赛结束,题解告诉我,公式秒杀法…… 但是公式看不懂,幸好有群巨解说,所以有些听懂了,但还是需要继续思考才能弄懂. 题解: 设ans[i]表示i

关于递归的理解及递归表达式复杂度分析(以求解最大公约数为例)

一,递归的四大基本法则: ①基准情形 基准情形是指那些不需要递归(不需要经过函数调用)之后就能退出的情况.它保证了递归的结束. ②不断推进 每一次递归之后,都要向着基准情形靠近,并且在靠近的过程中问题的规模越来越小. ③设计法则 书上说是:假设所有的递归调用都能运行-----“不是特别理解” ④合成效益法则 不要在不同的递归调用中做重复的工作. 二,实例 求解最大公约数--采用欧几里德算法 1 public static int gcd_recursive(int m, int n){ 2 if

两种方法求最大公约数最小公倍数

<pre name="code" class="cpp">/* *coyright(c)2014 龙城无泪 *All rights reserved *文件名称 digui.c *作者:封尘之魂 *完成日期:20141108 *版本号V1.0 *问题描述:求两个整数的最大公约数最小公倍数 *输入描述:输入两个整数 *输出描述:成功输出最大公约数最小公倍数 */ #include<stdio.h> int main() {int m,n,q,t

求解第N个素数

这个题目是现代软件工程老师布置的一个个人项目,当看到这个题目第一个想到的就是筛法.然而仔细考虑下,筛法的信息冗余量实在太大,我要求第N个素数,却把前N个素数都求了出来,那有没有一个直接能求解第N个素数是什么的方法呢?答案当然是...没有.但是,有一种方法用迭代的方法能够求解π(x),即是0~x中素数的个数,它就是梅塞尔—勒梅尔公式,黑科技一般的公式.具体这个公式是什么样的,贴出来太麻烦,可以去wiki看一下,搜索素数计数函数即可(中文版需FQ). 把这个问题搞定后,怎么求得第N个素数呢?显然当N