• java实现第二届蓝桥杯最小公倍数(c++)


    最小公倍数、
    为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。
    但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。
    事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。

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

    不要小看这个数字,它可能十分大,比如n=100, 则该数为:
    69720375229712477164533808935312303556800

    请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。

    例如:
    用户输入:
    6
    程序输出:
    60

    用户输入:
    10
    程序输出:
    2520

    要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
    相关的工程文件不要拷入。
    对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
    不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

    Java解法:

    import java.math.BigInteger;
    import java.util.Scanner;
    
    public class Main {
        
        public void getResult(int n) {
            BigInteger temp1 = BigInteger.ONE;
            BigInteger temp2 = BigInteger.ONE;
            BigInteger temp3 = BigInteger.ONE;
            for(int i = 2;i <= n;i++) {
                temp1 = temp3;
                temp2 = new BigInteger(""+i);
                temp3 = temp1.gcd(temp2);
                temp3 = temp1.multiply(temp2).divide(temp3);
            }
            System.out.println(temp3);
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            test.getResult(n);
        }
    }
    

    C++解法:

    解答:
    最小公倍数就是所有质数的相应幂的积
    比如N=10
    小于10的质数有2,3,5,7
    对应的最大幂是:3,2,1,1
    则最小公倍数是:2^3x3^2x5^1x7^1 = 2520
    
     #include <iostream>
     #include <cstring>
     #include <cmath>
     using namespace std;
     
     int a[50] = {0};//存素数 
     bool vis[100];
     int b[50] = {0};//存幂次 
     
     void init_prim()//求小于100的所有素数存入数组a 
     {
          int i,j,k;
          int m = (int)(sqrt(100.0)+0.5);
          memset(vis,0,sizeof(vis));
          vis[0] = 1;
          vis[1] = 1;//必须加上,否则第一个素数别认为是1 
          for(i=2; i<=m; i++)
          if(!vis[i])
          {
               for(j=2*i; j<=100; j+=i)
                    vis[j] = 1;
          }
          int t = 0;
          for(k=0; k<100; k++)
          if(!vis[k])
               a[t++] = k;
     }
          
     int main()
     {
          int i,j,k;
          init_prim();
          int n;
          //2^6 = 64,2^7 = 128;由于n最大100,幂次最大6 
         // for(i=0 ; i<100; i++)//素数没问题 
         // if(!vis[i])
         //      cout<<i<<endl;
        //  while(1);
          while(cin>>n)
          {
               memset(b,0,sizeof(b));
               for(i=0; i<=n&&a[i]<=n; i++)//”1到n素数个数小于n的一半 “不对,3有两个素数 
               {
                   // cout<<a[i]<<"-----"<<endl;
                    for(j=1; j<=6; j++)
                    {
                         if(pow((double)a[i],(double)j)>(double)n)
                         {
                              b[i] = j -1;//b的下标不必新开  
                              break;
                         }
                         else if(pow((double)a[i],(double)j) == (double)n)//必须分开 
                         {
                               b[i] = j;
                              break;     
                         }
                    }                                   
               }
               //不知道是不是pow函数的问题,把ans定义为int得出的结果出问题,double就对了 
               double ans = 1;
               for(k=0; k<i; k++)
               {
                    //cout<<a[k]<<"........"<<b[k]<<endl;
                    ans *= pow((double)a[k],(double)b[k]);
               }
               cout<<(int)ans<<endl;      
          }
          return 0;     
     }
     
     //该程序 到25时就溢出,ans换位long long前几个就错误啦,此时需要把pow函数换掉
    
     #include <iostream>
     #include <cstdio>
     #include <cstring>
     #include <cmath>
     using namespace std;
     
     const int N = 105;
     int n;
     int a[N][50];
     int b[N] = {0};
     
     void multiply()
     {
         int i,j,k;
         memset(a,0,sizeof(a));
         for(i=3; i<=100; i++)
         {
             /*
             下面的是直接按平常的乘法,乘数的一位乘以被乘数的每一位并处理进位;另外是乘数整体乘以被乘数的每一位最后统一处理进位
             */
             int temp = 0; 
             a[i][0] = 1;//很重要 
             for(j=2; j<=i; j++)
             {
                 int  c = 0; 
                 for(k=0; k<50; k++)//最大不超过160位 ,目前是100!,最后除以3等50 
                 {
                     temp = a[i][k]*b[j] + c;
                     a[i][k] = temp%1000;
                     c = temp/1000;
                 }          
             }
         }
     }
     
     void printData(int n)
     {
         int i,j,k;
         for(i=49; i>=0; i--)
         if(a[n][i])
             break;
         cout<<a[n][i];//第一个不输出前导0 
         for(j=i-1; j>=0; j--)
             printf("%03d",a[n][j]);
         cout<<endl;   
     }
     
     int main()
     {
         int i, j, k;
         for(i=0; i<N; i++)
                 b[i] = i;
         for(i=2; i<N; i++)
             for(j=i+1; j<=N; j++)
             {
                 if(b[j]%b[i]==0)
                     b[j] /= b[i];
                 //cout<<b[j]<<endl;
             }
         //for(i=0; i<100; i++)
           //  cout<<b[i]<<endl;
         //while(1);
         multiply();
         
         while(cin>>n)
         {
             
             if(n==1||n==2)
             {
                 cout<<n<<endl;
                 continue;
             }
             
             printData(n);
         }
         return 0;
     }
    
  • 相关阅读:
    php单点登录
    【Docker】docker镜像构建
    【测试经验】网关中间件测试
    【Jmeter】调用Dubbo方法
    【计算机网络】TCP三次握手与四次挥手
    【操作系统】死锁
    【操作系统】线程与进程
    【计算机网络】TCP/IP
    【计算机网络】Http与Https
    【二叉树】二叉树的创建与遍历
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077098.html
Copyright © 2020-2023  润新知