判斷和爲給定值的素數對對數
如給定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,那麼就是2的n次方;
- 用1做移位操作,每次向左移一位,如果小於給定值,則繼續移位,如果等於給定值說明這個數就是,如果大於說明不是;
- 給定數&給定數-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;
}
}