有理数分解-数论

题目描述 Description

  任何一个[0,1]中的有理数p/q(p、q均为自然数)一定可以分解成1/r1+1/r2+1/r3+…+1/rk,且r1<r2<r3<…<rk。当然这样的分解不是唯一的,如5/6=1/2+1/3=1/2+1/5+1/8+1/120,第一个分解式中的第二项比第二个分解式中的第二项大,因此我们可以定义第一个分解式比第二个分解式大。

  程序要求找出p/q的最大分解式。

输入输出格式 Input/output

输入格式:
键盘输入p、q,1≤p≤q≤50

输出格式:
从小到大依次输出分解式中的每个分母,一行输出一个数

输入输出样例 Sample input/output

样例测试点#1

输入样例:

5 6
输出样例:

2 3

思路:

假设1/r是能从p/q中分解出来的最大分子为1的真分数,则1/r≤p/q<1/(r-1)①

又因为p/q-1/r=(p×r-q)/(q×r)②

根据①可知,p×(r-1)<q,所以p×r-p<q,代入②中可看出,每次待分解的分数的分子一定单调下降,所以就可以用单精度除法(高精度除以普通整数)解决本题。

在输入p、q后要对分数进行化简。

代码如下:

 1 #include <stdio.h>
 2 int gcd(int a,int b)//求最大公约数
 3 {
 4     int r=a%b;
 5     while(r>0)
 6     {
 7         a=b;
 8         b=r;
 9         r=a%b;
10     }
11     return b;
12 }
13 int main()
14 {
15     int p,q;
16     int cm;//当前最大公约数
17     int r;
18     scanf("%d%d",&p,&q);
19     while(p>0)
20     {
21         cm=gcd(p,q);
22         if(cm>0)
23         {
24             /*===========*///化简分数
25             p=p/cm;
26             q=q/cm;
27             /*===========*/
28         }
29         if((q%p)>0)//如果不能分解为最终的1/rk
30         {
31             r=q/p+1;
32         }
33         else
34         {
35             r=q/p;
36         }
37         printf("%d\n",r);
38         p=p*r-q;//减掉
39         q=q*r;
40     }
41     return 0;
42 }
时间: 2024-10-20 02:31:31

有理数分解-数论的相关文章

【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status][Discuss] Description 一种非对称加密算法的密钥生成过程如下: 1.任选两个不同的质数p,q 2.计算N=pq,r=(p−1)(q−1) 3.选取小于r,且与r互质的整数e 4.计算整数d,使得ed≡1KQ/r 5.二元组(N,e)称为公钥,二元组(N,d)称为私钥 当需要加密

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

HDU3988-Harry Potter and the Hide Story(数论-质因数分解)

Harry Potter and the Hide Story Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2193    Accepted Submission(s): 530 Problem Description iSea is tired of writing the story of Harry Potter, so,

hdu 1299 数论 分解素因子

题意:求1.1/x+1/y=1/z 给定z 求x,y的个数zsd:1: 要知道这个素数的因子的范围 范围为2--sqrt(n);2: 带入方程得:x = n * n / k + n ; 现在就变成了求x的值.又因为n一定大于k,所以转换成求n * n的分解数: 因为n = p1 ^ e1 * p2 ^ e2 *..........*pn ^ en sum ( n)= ( 1 + e1 ) * ( 1 +e2 ) * .........* ( 1 +en ); sum (n * n) = ( 1

HDU4497 GCD and LCM 数论 素数分解

题意很简单首先以前做最简单的LCM跟CGD的时候都知道先求出两个数A,B的最大公约数GCD,那么LCM可以利用  A*B/GCD来求得,这点一开始脑残了没想到,结果没有进行特盘所以错了,意思就是 题目给的L%G不为0的话就是无解,结果我给判其它的去了,肯定漏了些什么没有发现 然后对于 L/G进行素因子分解,同时任意的数都能够通过素因子分解来表示,所以三个解x,y,z也能分解 L/G = p1^q1*p2^q2.... x = p1^i1*... y = p1^j1*... z = p1^k1*.

简单数论之整除&质因数分解&唯一分解定理

[整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"a整除b"或"b能被a整除".a叫做b的约数(或因数),b叫做a的倍数. 简单数论之整除&质因数分解&唯一分解定理 原文地址:https://www.cnblogs.com/zjd-ac/p/10351608.html

[CodeForces - 1225D]Power Products 【数论】 【分解质因数】

[CodeForces - 1225D]Power Products [数论] [分解质因数] 题目描述 Time limit 2000 ms Memory limit 524288 kB Source Technocup 2020 - Elimination Round 2 Tags hashing math number theory *1900 Site https://codeforces.com/problemset/problem/1225/D 题面 Example Input 6

数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the

hdu 5108(数论-整数分解)

Alexandra and Prime Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1847    Accepted Submission(s): 629 Problem Description Alexandra has a little brother. He is new to programming. One