uva10392 Factoring Large Numbers

本文涉及的知识点是,使用线性筛选法得到素数表。

Table of Contents

1 题目

====================

Problem F: Factoring Large Numbers

One of the central ideas behind much cryptography is that factoring large numbers is computationally intensive. In this context one might use a 100 digit number that was a product of two 50 digit prime numbers. Even with the fastest projected computers this factorization will take hundreds of years.

You don't have those computers available, but if you are clever you can still factor fairly large numbers.

Input

The input will be a sequence of integer values, one per line, terminated by a negative number. The numbers will fit in gcc's long long int datatype. You may assume that there will be at most one factor more than 1000000.

Output

Each positive number from the input must be factored and all factors (other than 1) printed out. The factors must be printed in ascending order with 4 leading spaces preceding a left justified number, and followed by a single blank line.

Sample Input

90
1234567891
18991325453139
12745267386521023
-1

Sample Output

    2
3
3
5 1234567891 3
3
13
179
271
1381
2423 30971
411522630413

====================
 

2 思路

这是一个分解质因数问题,因为题目说明了数字不超过long long int表示的数,所以 这不是一个大数问题。基本的思路是首先得到素数表,再用输入的大数对素数表中的 素数依次作除法运算。

关键的地方有两个,一个是素数表的获得。这里使用了线性筛选法,把所有的合数筛去, 关键的思想在于每个合数都是被它的最小素因子筛去的,且只会被筛一次。

关键代码在于:

 if (!i%prime[k]) break;

之所以可以break在于,i可以整除prime[k], 在于下一次循环要筛的数字i*prime[k+1]一定已经被prime[k]筛过了,因为素数表是按大小排列的,prime[k]比prime[k+1]小,而每个合数都是被它最小的素因子筛出去的。

第二个点在于题目中已经说明,最多有一个素因子大于1000000,所以素数表只开到1000000就可以了, 如果遍历完素数表输入的数字还没有变成1,那么,将其最终结果输出就可以了,这个结果 就是那个大于1000000的因子,否则它一定可以被1000000内的素数整除。

3 代码

#include <stdio.h>
#include <string.h> #define N 1000000
long long prime[N];
short is_prime[N]; long long get_prime (long long prime[], long long n) {
long long i, j, k;
memset (is_prime, 0, sizeof(is_prime[0])*n); j = 0;
for (i=2; i<n; i++) {
if (!is_prime[i]) prime[j++] = i;
for (k=0; k<j && i*prime[k]<n; k++) {
is_prime[ i*prime[k] ] = 1;
if (!i%prime[k]) break;
}
} return j;
} int main() {
long long n;
long long i;
long long prime_num; prime_num = get_prime (prime, N); while (scanf ("%lld", &n) != EOF) {
if (n == -1) break; for (i=0; i<prime_num && n!=1; i++) {
while (n % prime[i] == 0) {
printf (" %lld\n", prime[i]);
n /= prime[i];
}
}
if (n != 1) printf (" %lld\n", n);
printf ("\n");
} return 0;
}

uva10392 Factoring Large Numbers的更多相关文章

  1. [Typescript] Improve Readability with TypeScript Numeric Separators when working with Large Numbers

    When looking at large numbers in code (such as 1800000) it’s oftentimes difficult for the human eye ...

  2. 【概率论】6-2:大数定理(The Law of Large Numbers)

    title: [概率论]6-2:大数定理(The Law of Large Numbers) categories: - Mathematic - Probability keywords: - Ma ...

  3. Law of large numbers and Central limit theorem

    大数定律 Law of large numbers (LLN) 虽然名字是 Law,但其实是严格证明过的 Theorem weak law of large number (Khinchin's la ...

  4. 中心极限定理 | central limit theorem | 大数定律 | law of large numbers

    每个大学教材上都会提到这个定理,枯燥地给出了定义和公式,并没有解释来龙去脉,导致大多数人望而生畏,并没有理解它的美. <女士品茶>有感 待续~ 参考:怎样理解和区分中心极限定理与大数定律?

  5. Markov and Chebyshev Inequalities and the Weak Law of Large Numbers

    https://www.math.wustl.edu/~russw/f10.math493/chebyshev.pdf http://www.tkiryl.com/Probability/Chapte ...

  6. 大数定律(Law of Large Numbers)

    大数定律:每次从总体中随机抽取1个样本,这样抽取很多次后,样本的均值会趋近于总体的期望.也可以理解为:从总体中抽取容量为n的样本,样本容量n越大,样本的均值越趋近于总体的期望.当样本容量极大时,样本均 ...

  7. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  8. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  9. UVA 10392 (13.07.28)

    Problem F: Factoring Large Numbers One of the central ideas behind much cryptography is that factori ...

随机推荐

  1. linux系统下git使用

    转载:http://www.cnblogs.com/bear2flymoon/p/4335364.html?ADUIN=563508762&ADSESSION=1430887070&A ...

  2. java===java基础学习(11)---继承

    继承可以解决代码复用,让编程更加靠近人的思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法.所有的子类不需要重新定义这些属性和方法,只需要通过ex ...

  3. monkey测试===什么是monkey测试(系列一)转

    本文转自:http://www.cnblogs.com/liu-ke/p/4353926.html Monkey工具使用 一. 什么是Monkey Monkey是Android中的一个命令行工具,可以 ...

  4. nodejs 优雅的连接 mysql

    1.mysql 及 promise-mysql nodejs 连接 mysql 有成熟的npm包 mysql ,如果需要promise,建议使用 promise-mysql: npm:https:// ...

  5. 2017多校第6场 HDU 6105 Gameia 博弈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6105 题意:Alice和Bob玩一个游戏,喷漆!现在有一棵树上边的节点最开始都没有被染色.游戏规则是: ...

  6. C++ 模板的用法

    C++中的高阶手法就会用到泛型编程,主要有函数模板, 在程序中使用模板的好处就是在定义时不需要指定具体的参数类型,而在使用时确可以匹配其它任意类型, 定义格式如下 template <class ...

  7. SPOJ Two Paths

    Description 给定一个无向图,含有一定的路.从中找出两个最长的路径(每条路径有一些相通路组成)这两个路径不能经过公共的点,求何时二路径的乘积最大. 本题给出的无向图是一棵树,每边权值为1. ...

  8. 【hdoj_2570】迷障

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2570 思路:贪心法.要求在浓度不超标的情况下,解药的最大体积.由于体积相同,可以先对浓度排序,然后从浓度小 ...

  9. Qt笔记——多线程

    这个例子是,点击开始按钮,数字累加,点击停止按钮,数字不动. 1,新建一个类,里面是子线程的内容 #ifndef MYTHREAD_H #define MYTHREAD_H #include < ...

  10. 181. Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...