nyoj 517 最小公倍数

最小公倍数

时间限制: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

可以发现,1到n的最小公倍数,是1到n-1的最小公倍数乘以n的所有素因子中没有被1到n-1包含的素因子。

例如:1到7的最小公倍数是2*3*2*5*7,8=2*2*2,(8中2出现3次,1到7的素因子中只出现2次)那么1到8就是2*3*2*5*7*2

#include <iostream>
#include <string.h>//memset函数的头文件
using namespace std;
#define M 105
#define MAX 1000
int main() {
    int a[M],i,j;
    int b[1000];
    for(i=1; i<M; i++)
        a[i]=i;
    /*因为当前数可能是以后数的因子,则把当前数以后的数的因子去掉,剩余的数相乘就好啦*/
    for(i=2; i<M; i++) {
        for(j=i+1; j<M; j++) {
            if(a[j]%a[i]==0) {
                a[j]=a[j]/a[i];
            }
        }
    }
    int n;
    int c;//余数
    int s;
    while(cin>>n) {
//      memset(b,0,1000*sizeof(int));
        memset(b,0,sizeof(b));
        b[0]=1;
//将b[1]-b[n]中所有数相乘起来就是最小公倍数
        for(i=2; i<=n; i++) {
            //乘以a[i]
            c=0;
            for(j=0; j<MAX; j++) {
                s=b[j]*a[i]+c;
                b[j]=s%10;
                c=s/10;
            }
        }
        //输出
        for(j=MAX-1; j>=0; j--)  //忽略前导0
            if(b[j])
                break;

        for(i=j; i>=0; i--)
            cout<<b[i];
        cout<<endl;
    }
    return 0;
}
时间: 2024-10-08 08:38:03

nyoj 517 最小公倍数的相关文章

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]; s[

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]

NYOJ 972 核桃的数量 (最小公倍数)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=972 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 1. 各组的核桃数量必须相同(前提是这组得有人) 2. 各组内必须能平分核桃(当然是不能打碎的) 3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛) 输入 输入包含三个整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c<100)

最大的最小公倍数 NYOJ 977

1 #include<stdio.h>//最大的最小公倍数(977) 2 int main() 3 { 4 long long n,res; 5 while(scanf("%lld",&n)!=EOF){ 6 if(n<3)res=n; 7 else if(n%2)res=n*(n-1)*(n-2); 8 else { 9 res=n*(n-1)*(n-3); 10 if(n%3==0)res=(n-1)*(n-2)*(n-3); 11 } 12 printf

NYOJ 972 核桃的数量【最小公倍数】

还要考虑0这个特殊的条件,比较坑 题目链接 #include<stdio.h> int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int a,b,c,n,m; while(~scanf("%d%d%d",&a,&b,&c)) { if(a&&b&&c) { n=a/gcd(a,b)*b; m=n/gcd(n,c)*c; printf(&quo

NYOJ 977 最大的最小公倍数

#include<stdio.h>int main(){ long long t,n; while(~scanf("%lld",&n)) { if(n==1) t=1; else if(n==2) t=2; else if(n%2) t=n*(n-1)*(n-2); else { if(n%3) t=(n-1)*(n-2)*(n-3); else t=n*(n-1)*(n-3); } printf("%lld\n",t); }}

HDU 1108: 最小公倍数

最小公倍数 #include<iostream> using namespace std; int gcd(int a, int b) { while (b) { int t = a%b; a = b; b = t; } return a; } int lcm(int a, int b) { return a / gcd(a, b)*b; } int main() { ios::sync_with_stdio(false); int a, b; while (cin >> a &g

辗转相除法 求最大公约数和最小公倍数

# include<stdio.h> int main() { int a,b,c,x,y; printf("请输入两个正整数,用逗号间隔:"); scanf("%d,%d",&a,&b); x=a; y=b; if (a<b) { c=a; a=b; //要保证 a>b b=c; } while (b!=0) { c=a; a=b; b=c%b; } c=x*y/a; printf("最大公约数为%d,最小公倍数为

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.