2015华为机试——计算两个正整数的最大公约数和最小公倍数

题目描述:

接口说明

原型:

long getMaxDivisor(long lFirstInput, long lSecondInput);

输入参数:

int first: 第一个整数;

int second: 第二个整数;

返回值:

最大公约数

long getMinMultiple(long lFirstInput, long lSecondInput);

输入参数:

int first: 第一个整数;

int second: 第二个整数;

返回值:

最小公倍数

解题思路:使用辗转相除法即可求得最大公约数,两个数的最小公倍数=两数乘积/两数的最大公约数

辗转相除法:

设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r(0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除r2,……如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a,
b)。

例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。

代码如下:

    public static long getMaxDivisor(long lFirstInput, long lSecondInput)
    {
        long mul,temp;
        mul=lFirstInput*lSecondInput;
        while (lFirstInput!=0)
		{
			temp=lFirstInput;
			lFirstInput=lSecondInput%lFirstInput;
			lSecondInput=temp;
		}
        return lSecondInput;
    }

    // 功能:获取两个整数的最小公倍数
    // 输入:两个整数
    // 返回:最小公倍数
    public static long getMinMultiple(long lFirstInput, long lSecondInput)
    {
        long mul,temp;
        mul=lFirstInput*lSecondInput;
        while (lFirstInput!=0)
		{
			temp=lFirstInput;
			lFirstInput=lSecondInput%lFirstInput;
			lSecondInput=temp;
		}
        return mul/lSecondInput;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 02:35:33

2015华为机试——计算两个正整数的最大公约数和最小公倍数的相关文章

2015华为机试—— 计算二进制数的0的个数

描述: 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别:位运算 难度:初级 运行时间限制:无限制 内存限制:无限制 阶段:入职前练习 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 解题思路: 对于给定的数n,使用位运算:n=n&(n-1)可计算出对应二进制中1的个数,为count1.将input=n,input=input>>1逐个获取input中

2015华为机试——计算整数的位数

题目描述: 输入一个五位以内(包括5位)的正整数,(1)判断它是一个几位数:(2)逆序输出其各位数字. 输入:多组数据,每组一行 输出:对应一行输出 样例输入:56439 样例输出:5 93465 解题思路:使用StringBuffer的reverse方法即可. 代码如下: public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()) { String input=

欧几里得算法 - 计算两个正整数的最大公约数

欧几里得算法-计算两个正整数a,b的最大公约数 #定理:gcd(a,b) = gcd(b, a mod b) 终止条件:余数等于0 返回结果:余数等于0时的除数b # -*- coding: utf-8 -*- __author__ = 'nob' #迭代欧几里得 def iterative_gcd(a, b):     r = a % b     while(r):         a = b         b = r         r = a % b     return b     #

求两个正整数的最大公约数和最小公倍数(java)

1 package com.hpu.bai; 2 3 import java.util.Scanner; 4 5 public class Common { 6 public int mincom(int m,int n){ 7 int temp;int t = 0; 8 if(m<n){ 9 temp = n; 10 n =m; 11 m =temp; 12 } 13 if(m%n ==0) return n; 14 else 15 return mincom(m-n,n); 16 } 17

2015华为机试——最高分是多少

题目描述: 老师想知道从某某同学到某某同学当中,分数最高的是多少. 现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 题目类别: 排序 难度: 初级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 输入包含多组测试数据. 每组输入第一行是两个正整数N和M(0<N<=30000,0<M<5000),分表代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩.

C语言计算两个正整数的最大公约数与最大公倍数

先给出源码,下面解释. #include <stdio.h> void main() { int a,b,c,d;  //定义四个变量 scanf("%d,%d",&a,&b); d=a*b;  //求出两个正整数的乘积 while (b!=0) { c=a%b;//重点是这里 ,很多人看不懂,再往下面看 a=b; b=c; } printf("最大公约数为%d,最大公倍数为%d\n",a,(d/a)); } 最小公倍数的求法:a*b/最

计算两个整数的最大公约数和最小公倍数

算法一 任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现. 则整数x,y可以分别标记为:x=p1x1p2x2...pmxm y=p1y1p2y2...pmym (其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0) (1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym) (2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax(xm,ym

【C】计算两个整数的最大公约数和最小公倍数

数学知识背景记录: 任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现. 则整数x,y可以分别标记为:x=p1x1p2x2...pmxm y=p1y1p2y2...pmym (其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0) (1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym) (2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax

2015华为机试

第一题(60分): 按要求分解字符串,输入两个数M,N:M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0.例如:输入2,8, "abc" ,"123456789",则输出为"abc00000","12345678","90000000" #include<iostream> using namespace std; void solve(char *str , int n , in