最小公倍数(大数)

最小公倍数

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。

但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。

事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。

我们希望寻找到能除尽1至n的的每个数字的最小整数m.

输入
多组测试数据(少于500组)。 每行只有一个数n(1<=n<=100).
输出
输出相应的m。
样例输入
2
3
4
样例输出
2
6
12题解:简单大数,注意要先处理下;只需要大数相乘就可以了;代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
typedef long long LL;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int ans[110];
int s[110];
int main(){
    int n;
    while(~SI(n)){
        int tp=1;
        s[0]=1;
        for(int i=1;i<=n;i++){
            s[i]=i;
            for(int j=0;j<i;j++)
                s[i]=s[i]/gcd(s[j],s[i]);
        }
        ans[0]=1;
        for(int i=1;i<=n;i++){
            int temp=0;
            for(int j=0;j<tp;j++){
                temp=ans[j]*s[i]+temp;
                ans[j]=temp%10;
                temp/=10;
            }
            while(temp){
                ans[tp++]=temp%10;
                temp/=10;
            }
        }
        for(int i=tp-1;i>=0;i--)printf("%d",ans[i]);puts("");
    }
    return 0;
}

时间: 2024-12-19 22:53:43

最小公倍数(大数)的相关文章

nyoj 517 最小公倍数 【java大数】

我自己写了一个gcd TL了,然后调用了math里面的gcd,AC了... 思路:就是拿n前面的最小公倍数和n求 1~n的最小公倍数 代码: import java.util.Scanner; import java.math.*; public class Main{ public static void main(String[] args){ Scanner cin = new Scanner(System.in); BigInteger[] s = new BigInteger[102]

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

ACM学习历程—HDU 3092 Least common multiple(数论 &amp;&amp; 动态规划 &amp;&amp; 大数)

hihoCoder挑战赛12 Description Partychen like to do mathematical problems. One day, when he was doing on a least common multiple(LCM) problem, he suddenly thought of a very interesting question: if given a number of S, and we divided S into some numbers

常见算法:C语言求最小公倍数和最大公约数三种算法

最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去运行① 比如求27和15的最大公约数过程为: 27÷15 余1215÷12余312÷3余0

求最大公约数和最小公倍数

学习C++入门级的题目,求最大公约数和最小公倍数,这里介绍两种求最大公约数的方法,即辗转相除法和辗转相减法.辗转相除法的原理自行百度,辗转相减法的原理就是只要两数不想等就用大数减小数,直至相等,求最小公倍数的方法就是用两数的乘积除以最大公约数. #include<iostream> using namespace std; int maxf(int a,int b)//辗转相减法 { while(a != b) { if(a > b) return a = a - b; else ret

最大公约数(gcd)和 最小公倍数(lcm)——辗转相除法

辗转相除法(又称欧几里得算法)是求最大公因数的算法 要求a,b的最大公约数(a>b),我们可以递归地求b,a%b的最大公约数,直到其中一个数变成0,这时另一个数就是a,b的最大公约数. C++实现: int gcd(int a,int b){ retuen b?gcd(b,a%b):a; } 或: while(b!=0)  {  temp=a%b;   a=b;   b=temp; } 证明:(引自百度百科) 设两数为a.b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod

poj 3101 Astronomy(分数的最小公倍数)

http://poj.org/problem? id=3101 大致题意:求n个运动周期不全然同样的天体在一条直线上的周期. 这题我是看解题报告写的,没想到选用參照物,用到了物理中的角速度什么的. 由于n个天体的周期已知,那么它们的角速度为vi = 2*pi/Ti,若统一选第0个天体为參照物,那么其余天体的相对速度vi' =  2*pi*(T0-Ti)/(T0*Ti)(把周期T同样的天体合为一个天体).则与第0个天体角度相差180度的时间为ti = (T0*Ti)/((T0-Ti)*2). 那么

辗转相除 求最大公约数!or 最小公倍数

求最大公约数和最小公倍数的经典算法--辗转相除法描述如下: 若要求a,b两数的最大公约数和最小公倍数,令a为a.b中较大数,b为较小数,算法进一步流程: while(b不为0) { temp=a%b: a=b: b=temp } 最后a即为两数的最大公约数,最大公倍数为: a*b/最大公约数 c语言代码: 01.int divisor (int a,int b) /*自定义函数求两数的最大公约数*/ 02.{ 03. int temp; /*定义整型变量*/ 04. if(a<b) /*通过比较

一天一个算法:求俩个数的最大公约数和最小公倍数

求俩个数的最大公约数和最小公倍数 解答: 当较大数除以较小数余数等于0时,较小数为最大公约数. 两数相乘结果除以它们的最大公约数为最小公倍数. int cdivisor(int x1,int y1) { int r,temp; if (x1<y1) { temp =x1; x1 = y1; y1 = temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultipl