工作示例找到超过2个数字的LCM

时间:2012-12-30 10:23:26

标签: android lcm

Android 2.3.3

我已经编写了一个计算LCM超过2个数字的程序,它对我有用。我想分享它,以便它可以为那些正在寻找它的人派上用场。这可能不是最好的解决方案,但是,我根据我的要求做到了。您可以根据需要进行修改。

我对输入进行了硬编码,并且我的程序也使用ArrayLists来执行操作。您可能想要更改这些。

先决条件::: 1.计算输入范围的PrimeNumbers。

public class PlusMinusActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */

    EditText edtxtExpression;
    Button btnLCM, btnGCD;

    ArrayList<String> alPrimes = new ArrayList<String>(); // Contains List of Prime Numbers
    ArrayList<String> alNumbers = new ArrayList<String>(); // Contains the input => Numbers for which LCM is to be determined
    ArrayList<String> alResult = new ArrayList<String>(); // Contains the numbers that make up the LCM


    String strExp = ""; // Temporary String to display the result

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        edtxtExpression = (EditText)findViewById(R.id.edtxtExpression);
        btnLCM = (Button)findViewById(R.id.btnLCM);
        btnGCD = (Button) findViewById(R.id.btnGCD);

        btnLCM.setOnClickListener(this);
        btnGCD.setOnClickListener(this);

        addData();

        strExp = alNumbers.toString();
        System.out.println("strExp Value is ::: "+strExp);
    }




    private void addData() {
        // TODO Auto-generated method stub


        //alPrimes.add(String.valueOf(1));
        alPrimes.add(String.valueOf(2));
        alPrimes.add(String.valueOf(3));
        alPrimes.add(String.valueOf(5));
        alPrimes.add(String.valueOf(7));
        alPrimes.add(String.valueOf(9));
        alPrimes.add(String.valueOf(11));
        alPrimes.add(String.valueOf(13));
        alPrimes.add(String.valueOf(17));
        alPrimes.add(String.valueOf(19));
        alPrimes.add(String.valueOf(23));
        alPrimes.add(String.valueOf(29));


        alNumbers.add(String.valueOf(1));
        alNumbers.add(String.valueOf(5));
        alNumbers.add(String.valueOf(7));
        alNumbers.add(String.valueOf(9));

        System.out.println("alPrimes ::: "+alPrimes.toString());
        System.out.println("alNumbers ::: "+alNumbers.toString());

    }




    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub


        switch (v.getId()) {
        case R.id.btnLCM:
            calculateLCM();
            break;

        case R.id.btnGCD:
            calculateGCD();
            break;
        default:
            break;
        }

    }


    // Calculates LCM
    private void calculateLCM() {
        // TODO Auto-generated method stub

        int i=0, count=0;

        while(i < alPrimes.size()) 
        {
            count = 0;
            int p = Integer.parseInt(alPrimes.get(i)); // Getting the element from PrimeNumbers List
            System.out.println("Prime Number ::: "+p);
            int j=0;

            while(j < alNumbers.size())
            {
                int n = Integer.parseInt(alNumbers.get(j)); // Getting the number from Input List
                System.out.println("Number ::: "+n);

                if(n % p == 0 && n != 1)
                {
                    count++; // Counts the number of integers that gets divided (% = 0) by that particular prime number
                    System.out.println("Count :::"+count);
                }

                j++;
            }


            if(count >= 2) // If two or more numbers, gets divided, then we do the division
            {
                alResult.add(String.valueOf(p)); // adding the prime number to Result list
                System.out.println("Result ::: "+alResult.toString());

                j=0;

                while(j < alNumbers.size())
                {

                    int n = Integer.parseInt(alNumbers.get(j));
                    System.out.println("Number ::: "+n);


                    if(n % p == 0)
                    {
                        int result = n/p;
                        System.out.println("Temp Result ::: "+result);

                        alNumbers.remove(j); // Replace the element by the result
                        System.out.println("After Removing ::: "+alNumbers.toString());
                        alNumbers.add(j, String.valueOf(result));
                        System.out.println("After Adding ::: "+alNumbers.toString());
                    }

                    j++;
                }

                i = -1; // iterate the Input list from the start
            }

            else if(count == 0 || count == 1)
            {
                boolean allPrimes = checkAllPrimes();

                if(allPrimes)
                {
                    break;
                }
            }


            i++;
        }


        calculateResult();


    }

    // Calculates the result 
    private void calculateResult() {
        // TODO Auto-generated method stub

        int i=0;

        while(i < alNumbers.size())
        {
            alResult.add(alNumbers.get(i));
            i++;
        }

        int result = 1;
        i=0;

        while(i < alResult.size())
        {
            result *= Integer.parseInt(alResult.get(i));
            i++;
        }

        edtxtExpression.setText("LCM of "+strExp+" is ::: "+result);
    }



    // Checks whether the elements in the ArrayList are all prime numbers
    // returns true if all are prime
    //
    private boolean checkAllPrimes() {
        // TODO Auto-generated method stub

        int i=0;
        boolean areAllPrimes = true;

        while(i < alNumbers.size())
        {
            int n = Integer.parseInt(alNumbers.get(i));

            if(! (alPrimes.contains(n) || n == 1))
            {
                areAllPrimes = false;
                break;
            }

            i++;
        }


        return areAllPrimes;
    }




    private void calculateGCD() {
        // TODO Auto-generated method stub

    }

}

Output of the Program

对于以下输入:::

alNumbers.add(String.valueOf(10));
alNumbers.add(String.valueOf(15));
alNumbers.add(String.valueOf(20));
alNumbers.add(String.valueOf(25));

Output with different Inputs

对于以下输入:::

alNumbers.add(String.valueOf(10));
alNumbers.add(String.valueOf(15));
alNumbers.add(String.valueOf(20));
alNumbers.add(String.valueOf(25));
alNumbers.add(String.valueOf(110));
alNumbers.add(String.valueOf(130));

Output for 6 values

我对Android和Java也很陌生。所以,如果这不是一个好的解决方案,请不要介意。

希望它有所帮助...

2 个答案:

答案 0 :(得分:1)

您可以使用这个想法简化您的代码:

    static int ggt(int a, int b)
    {
        if (b == 0)
            return a;
        return ggt(b, a % b);
    }

    static void Main(string[] args)
    {
        int lcm = 1;

        foreach(int x in new int[] { 1,5,7,9 })
            lcm = x * lcm / ggt(x, lcm);

        Console.WriteLine("{0}", lcm);
    }

语法是c#,但希望足够可读。 'ggt'是德语'gcd'(最大公约数)的缩写

答案 1 :(得分:0)

//LCM of range of numbers using JAVA
n=s.nextInt();//Reading range value
for(i=0;i<n;i++)
{
    a[i]=s.nextInt();   //reading list of numbers
}
Arrays.sort(a,0,n);   //Sorting the numbers
k=a[n-1];   //Assigning biggest value in the sorted array to k
j=1;          
l=k;         
for(i=0;i<n;i++)
{
    if(k%a[i]==0)
    {
       continue;  //checking whether all the elements are divisible by k
    }
    else 
    {
       j=j+1; 
       k=l*j;//multiples of highest element i.e k in the sorted array 
       i=-1;//Assigning -1 to i, so as to check whether all the elements 
            //in the array are divisible by k or not from the beginning
    }
}
System.out.println("LCM of range of numbers:"+k);

输入:

6

2 4 6 8 9 3

输出:

数字范围的LCM:72