方法一:手算,五个五个写,慢点写
方法二:上机写代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY"; // 加密后的字符
String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 原字符
String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV"; // 加密后的字符
for(int i=0;i<str.length();i++){
System.out.print(s1.charAt(s2.indexOf(str.charAt(i))));
}
}
}
YeRikGSunlRzgDlvRwYkXkrGWWhXaA
方法一:计算器
36138 * 24 * 60
方法二:日期类
方法三:常规方法,判断是否是闰年再计算天数
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1=sf.parse("1921-7-23 12:0:0");
Date date2 = sf.parse("2020-7-1 12:0:0");
System.out.print((date2.getTime()-date1.getTime())/1000/60);
}
}
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Date date1 = new Date(21, 6, 23, 12, 0, 0); // 1921 年:是减去1900得到的数 月:0-11 日:1-31
Date date2 = new Date(120, 6, 1, 12, 0, 0); // 2020
long time=date2.getTime()-date1.getTime();
System.out.print((time/1000)/60);
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int day=0,i;
for(i=1922;i<=2019;i++){
if((i%400)==0||(i%4==0&&i%100!=0)){
day+=366;
}else{
day+=365;
}
}
day+=31-23+31+30+31+30+31; //1921年7月24日0点开始
i=2020;
if((i%400)==0||(i%4==0&&i%100!=0)){ //2020年7月1日24点结束
day+=31+29+31+30+31+30+1;
}else{
day+=31+28+31+30+31+30+1;
}
System.out.print(day*24*60);
}
}
52038720
设A国被测总人数n人,k人为一组,需要n/k个试剂盒子
感染人数0.01*n人,以最坏的情况分配试剂盒子,最多有0.01nk个试剂盒子需要重新检测
此时,总共需要检测n/k+0.01nk个试剂盒子
设y=n/k+0.01nk,n为定值,求k为多少时,y最小?
y=n(n/k+k/100) k=10时,y最小
10
方法一:01背包思想,求出当背包重量最大为sum/2时最大能装多少个口罩,然后乘以2,用sum减去就可以了。
方法二:深度优先搜索思想(速度时间复杂度比上面方法一更快一点),搜索所有情况。
import java.util.Scanner;
public class Main {
public static void main(String arg[]){
Scanner sc=new Scanner(System.in);
int[] dp=new int[49945000];
int[] nums = { 0, 9090400, 8499400, 5926800, 8547000, 4958200, 4422600,
5751200, 4175600, 6309600, 5865200, 6604400, 4635000, 10663400, 8087200, 4554000 };
int sum=0;
for(int i:nums){
sum+=i;
}
int avg=sum/2;
for(int i=1;i<nums.length;i++){
for(int j=avg;j>=1;j--){
if(nums[i]<=j){
dp[j]=Math.max(dp[j], dp[j-nums[i]]+nums[i]);
}
}
}
System.out.print((avg-dp[avg])*2);
}
}
import java.util.Scanner;
public class Main {
static int ans=Integer.MAX_VALUE;
static int[] num={ 9090400, 8499400, 5926800, 8547000, 4958200, 4422600,
5751200, 4175600, 6309600, 5865200, 6604400, 4635000, 10663400, 8087200, 4554000 };
public static void main(String arg[]){
dfs(0,0,0);
System.out.print(ans);
}
public static void dfs(int k,int sum1,int sum2){
if(k==15){
if(Math.abs(sum1-sum2)<ans){
ans=Math.abs(sum1-sum2);
}
return;
}
dfs(k+1,sum1+num[k],sum2);
dfs(k+1,sum1,sum2+num[k]);
}
}
BigInteger简直牛逼!就是费内存!
利用BigInteger里的a.gcd(b)方法求a和b的最大公约数
Scanner scanner = new Scanner(System.in); BigInteger x = scanner.nextBigInteger();//可以接收int类型 BigInteger y = scanner.nextBigInteger();//也可以利用BigInteger.valueOf()将其他类型转换为BigInteger类型 BigInteger gcd = x.gcd(y); //BigInteger自带的求最大公约数的方法 //BigInteger.valueOf()使用演示 int a = 10; BigInteger b = BigInteger.valueOf(a);
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigInteger arr[] = new BigInteger[2025]; // int long型数据均会爆数组
arr[0] = BigInteger.ZERO;
arr[1] = arr[2] = BigInteger.ONE;
for (int i = 3; i <= 2020; i++) {
arr[i] = arr[i - 1].add(arr[i - 2]); //BigInteger的加减乘除 与或非 等于 都有 .**** 可以自己才eclipse查看(直接. 就会出现很多方法)
}
for (int i = 1; i <= 7; i++) { // 输出斐波那契数组的元素值 验证
System.out.println(i + ": " + arr[i]);
}
System.out.println(arr[520]);
System.out.println(arr[2020]);
System.out.println(arr[2020].mod(arr[520]));
System.out.println(arr[2020].gcd(arr[520]));
// System.out.println(gcd(arr[2020],arr[520]));
}
// public static BigInteger gcd(BigInteger a, BigInteger b) {
// return b.equals(BigInteger.ZERO) ? a : gcd(b, a.mod(b));
// // if (b.compareTo(BigInteger.ZERO) == 0) {
// // return a;
// // }
// // return gcd(b, a.mod(b));
// }
}
大写字母、小写字母、数字、其他
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
int dx=0,xx=0,sz=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)>='A'&&str.charAt(i)<='Z'){
dx++;
}else if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
xx++;
}else if(str.charAt(i)>='0'&&str.charAt(i)<='9'){
sz++;
}
}
System.out.println(dx);
System.out.println(xx);
System.out.println(sz);
}
}
举例:
(2+5+7+9)%3=2
转换》》
2%3=2, 5%3=2, 7%3=1, 9%3=0
2+2+1+0=5%3=2
都能得到2,但是,万一2+2+1+0加起来的数超过了long所能存储的范围了呢? 行不通,继续转换
转换》》
2%3=2, 5%3=2, 7%3=1, 9%3=0
(2+2)%3=1 (1+1)%3=2 (2+0)%3=2
行了!这不都保证小于3了嘛!
利用好取模公式:ab mod c=((a mod c)(b mod c)) mod c
加法也一样,每两两取模
注意事项:
double的范围大。强转有损失
方法二:
biginteger yyds
多大的数都能接受,可以不用上面的相加时取余和单个数取余。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long sum=0L;
for(int i=1;i<=n;i++){
long s1=i*1L;
//long s2=s1;
for(int j=1;j<=3;j++){
s1=(s1*s1)%123456789L; //两两相乘取模
//s2=(long)Math.pow(s2,2)%123456789; //double的范围大。强转有损失
}
//sum+=(long)Math.pow((long)Math.pow((long)Math.pow(i,2)%123456789L,2)%123456789L,2)%123456789L;
sum+=s1;
sum%=123456789L;
}
System.out.print(sum);
}
}
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
BigInteger sum=BigInteger.ZERO;
for(int i=1;i<=n;i++){
BigInteger s=BigInteger.valueOf(i);
s=s.pow(8);
s=s.mod(BigInteger.valueOf(123456789));
sum=sum.add(s);
sum=sum.mod(BigInteger.valueOf(123456789));
}
System.out.print(sum);
}
}
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
BigInteger sum=BigInteger.ZERO;
for(int i=1;i<=n;i++){
BigInteger s=BigInteger.valueOf(i);
s=s.pow(8);
sum=sum.add(s);
}
sum=sum.mod(BigInteger.valueOf(123456789));
System.out.print(sum);
}
}
字典序要最大
如果i为1 、2并且与下一个字符加起来的数字小于26,两个数字组成一个字母
如果i > = 3 ,或者 大于26 ,一个数字组成一个字母
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
StringBuilder s=new StringBuilder();
for(int i=0;i<str.length();){
int n=str.charAt(i)-'0';
if(n<3&&i<str.length()-1){
int num=n*10+str.charAt(i+1)-'0';
if(num<=26){
s.append(Character.toString((char)(num+64)));
i+=2;
}else{
s.append(Character.toString((char)(n+64)));
i++;
}
}else{
s.append(Character.toString((char)(n+64)));
i++;
}
}
System.out.print(s);
}
}