数值运算问题

判断和为给定值的素数对对数

如给定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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值