數值運算問題

判斷和爲給定值的素數對對數

如給定10,存在(5,5),(3,7)兩對

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int num=0;
        for (int i = 2; i <=n/2; i++) {
            if (testZhishu(i)&&testZhishu(n-i)){
                num++;
            }
        }
        System.out.println(num);
    }

    private static boolean testZhishu(int n) {
        if (n==2||n==3){
            return true;
        }
        for (int i = 2; i <=n/2; i++) {
            if (n%i==0){
                return false;
            }
        }
        return true;
    }
}

兩個大整數乘積

import java.util.*;
import java.io.*;
import java.math.*;

public class Test{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String x,y,ans;
        while(in.hasNext()) {
            x=in.next();
            y=in.next();
            ans=mul(x,y);
            System.out.println(ans);
        }

    }

    public static String mul(String x,String y){
        if(x.charAt(0)=='-' && y.charAt(0) =='-') return _mul(x.substring(1),y.substring(1));
        if(x.charAt(0)=='-' && y.charAt(0)!='-') return _mul(x.substring(1),y);
        if(x.charAt(0)!='-' && y.charAt(0)!='-') return _mul(x,y);
        if(x.charAt(0)!='-' && y.charAt(0)=='-') return _mul(x,y.substring(1));
        return "0";
    }

    public static String _mul(String x,String y){
        String ans="0";
        int cnt=0;
        y=new StringBuffer(y).reverse().toString();
        while(true){
            if(x.length()==0) break;
            char ch=x.charAt(x.length()-1);
            int carry=0;
            String tmp="";
            for(int i=0;i<y.length();i++){
                carry=carry+(y.charAt(i)-'0')*(ch-'0');
                tmp+=""+carry%10;
                carry/=10;
            }
            tmp+=carry;
            tmp=new StringBuffer(tmp).reverse().toString();

            for(int i=0;i<cnt;i++){
                tmp+="0";
            }
            cnt++;

            ans=add(ans,tmp);
            x=x.substring(0,x.length()-1);
        }
        if(ans.equals("")) ans="0";
        return ans;
    }

    public static String add(String x,String y){
        int k=0;
        while(k<x.length() && x.charAt(k)=='0') k++;
        x=x.substring(k);
        k=0;
        while(k<y.length() && y.charAt(k)=='0') k++;
        y=y.substring(k);


        x=new StringBuffer(x).reverse().toString();
        y=new StringBuffer(y).reverse().toString();

        String ans="";
        int carry=0,i,j;
        for(i=0,j=0;i<x.length()&&j<y.length();i++,j++){
            carry+=(x.charAt(i)-'0')+(y.charAt(j)-'0');
            ans+=carry%10;
            carry/=10;
        }

        for(;i<x.length();i++){
            carry+=x.charAt(i)-'0';
            ans+=carry%10;
            carry/=10;
        }

        for(;j<y.length();j++){
            carry+=y.charAt(j)-'0';
            ans+=carry%10;
            carry/=10;
        }

        ans+=carry;
        ans=new StringBuffer(ans).reverse().toString();
        k=0;
        while(k<ans.length() && ans.charAt(k)=='0') k++;
        ans=ans.substring(k);
        if(ans.equals("")) ans="0";
        return ans;
    }
}

二進制運算

import java.util.Scanner;

public class Main  {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.next();
        String s2 = sc.next();
        int c = Integer.parseInt(s1, 2);
        int d = Integer.parseInt(s2, 2);
        String string = Integer.toBinaryString(c + d);
        System.out.println(string);

    }
}

如何判斷一個數是否爲2的n次方

  1. 可以統計這個數中二進制1的個數,如果只有一個1,那麼就是2的n次方;
  2. 用1做移位操作,每次向左移一位,如果小於給定值,則繼續移位,如果等於給定值說明這個數就是,如果大於說明不是;
  3. 給定數&給定數-1,比如給定數爲8 1000,8-1 0111 1000&0111=0,如果不是2的n次方則不爲0;
System.out.println((n&n-1)==0);

求n的階乘後面0的個數

只有出現2*5的時候纔會有0,又因爲5的個數少於2,所以只需要求n中是5的倍數的數的個數即可。

class Solution {
    public int trailingZeroes(int n) {
        int count=0;
        while(n>=5){
            count+=(n/5);
            n/=5;
            
        }
        return count;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章