分析:
文中要求阶乘中0的个数,这个时候,对于阶乘的理解,要想尾数包含0。需要考虑什么情况下才有0,只有2*5的时候,才会有0.但是对于2来说,4、6、8也含有2,导致了这三个数与5相乘含有0,前者的数量远远大于后者的数量。所以,为了简便和方便计算,我们只考虑因子5的个数,5有多少个,说明就有多少个尾数0能诞生。
java代码如下,包含了分析:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println(countNum(n));
}
}
public static int countNum(int n){
//count表示含有因子5的个数
int count = 0;
//输入的值从大于4开始算起
while(n > 4){
//准备一个临时变量,自身变量用于后面判断个数要用,需要自减
int temp = n;
while(temp % 5 == 0){
count++;
//去掉一个除掉的因子5,更新新的临时变量数
temp = temp/5;
}
n--;
}
return count;
}
}
分析:需要草稿纸上面画出过程,大概能看出一个等比的关系式,推到如草稿纸所示:
由草稿纸的推导分析,可以很简单的写出代码式子:
import java.util.*;
public class Balls {
public int calcDistance(int A, int B, int C, int D) {
// write code here
int result = 3*(A+B+C+D);
return result;
}
}
分析:此题不难,实质上就是查找输入的几个不同字符串的种类,对于重复的记作一个就行。利用Set集合的特性,即元素不重复就能够实现。代码如下:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
HashSet st = new HashSet();
while(sc.hasNext()){
String str = sc.next();
st.add(str);
}
System.out.println(st.size());
}
}
分析:这题难在不知道后面的数字怎么取,后来想到了substring方法对数组的后六位进行截取,这样就不用考虑每一个数组中英文字母的长度了。其次,对于截取的数字字符,怎么把它转换成对于的数字元素,这一点也难倒我了,看了别人的代码后,才知道用Integer.parseInt方法来处理,很巧妙。代码如下:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] m = new int[n];
for(int i = 0; i< n;i++){
String st = sc.next();
int len = st.length();
String str = st.substring(len-6,len);
m[i] = Integer.parseInt(str);
}
Arrays.sort(m);
for(int j = 0; j < n;j++){
System.out.println(m[j]);
}
}
}
}
分析见代码内容:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
//牛的数量
int n = sc.nextInt();
//每个牛拥有的苹果数量组成的数组
int[] arr = new int[n];
//苹果总数
int sum = 0;
for(int i = 0;i aver){
exceed = arr[i] - aver;
if(exceed %2 != 0){
System.out.println(-1);
return;
}else{
count += exceed/2;
}
}
}
System.out.println(count);
}
}
}
解方程 x²+ x <= 耐久度
一元二次方程 ax²+ bx + c =
0
, (a≠
0
)
运用求根公式: 在该题中 方程为:x²+ x <= 耐久度,将
1
耐久度移得:x²+ x - 耐久度 <=
0
(a=
1
, b=
1
, c=-耐久度)
判别式 △ : 当△>
0
时有俩个解,当△=
0
时有一个解,当△<
0
时没有解; 当如题实例 耐久度=
10
的时候:
△ = b² - 4ac
=
1
² -
4
*
1
* (-
10
)
=
41
因 △ >
0
, 因此有俩个解,根据该题要求,取最大解
求根公式: x = [-b±(b²-4ac)^(
1
/
2
)] / (2a) ,(
1
/
2
次方相当于开二次开根号)
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//耐久度
long count = sc.nextLong();
double delta = 1-4*1*(-count);
//△ < 0 无解
if(delta<0){
System.out.println(0);
return;
}
//耐久度不可能小于0,脱离实际情况
if(count < 0){
System.out.println(0);
return;
}
double x1 = (-1+Math.sqrt(delta))/2;
double x2 = (-1-Math.sqrt(delta))/2;
if(x1 > x2){
System.out.println((long) x1);
}else{
System.out.println((long) x2);
}
}
}
分析:本人做这个题目的时候,没有想到插入的字符串海报是可以拆开来的,陷入了固定思维,所以插入的新的字符串海报的长度加1,还需要减去自身重复的长度,代码实现如下:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String st = sc.next();
System.out.println((st.length()+1)*26 - st.length());
}
}
分析:不用动态规划,直接双指针跑起来就行。两个指针p1和p2初始分别指向两个字符串s和t的起始字符,如果相等,两个指针都移动,否则只移动p1。最后检查一下p2是不是移动到了t.length就行,如果到了就说明所有t中的字符都在s中按照t字符串的字符顺序出现过了。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int left1 = 0;
int left2 = 0;
while(left1 < c1.length && left2 < c2.length){
if(c1[left1] == c2[left2]){
left1++;
left2++;
}else{
left1++;
}
}
System.out.println(c2.length == left2? "Yes":"No");
}
}