NO1 打靶问题,打十次打靶,总分数为90分的情况有哪些?
NO2 阶乘末尾0的个数?
NO1 打靶问题,打十次打靶,总分数为90分的情况有哪些?
个人感觉比较像一类排列组合递归回溯的解法。
package com.lzg.flume.intercepter.suanfati;
public class DaBa {
public static int count = 0;
public static void printHis(int[] his) {
for (int i = 0; i < his.length; i++) {
System.out.print(his[i] + " ");
}
System.out.println();
}
public static void caculate(int times, int remainScore, int[] scoreHistory) {
if (remainScore < 0 || remainScore > times * 10) //程序递归退出的标志
return;
if (1 == times) {
if (remainScore >= 0 && remainScore <= 10) {
//代表最后一次打靶,如果剩余分数在0-10之间,就代表这次排列组合是成功的
scoreHistory[times - 1] = remainScore;
printHis(scoreHistory);//输出每一种排列组合情况
count++;
}
} else {
for (int i = 0; i <= 10; i++) {
//这次times打靶有11种分数可能性
scoreHistory[times - 1] = i;
caculate(times - 1, remainScore - i, scoreHistory);
}
}
}
public static void main(String[] args) {
int[] scoreHistory = new int[10];
//打10次打靶,总分数是90分的排列组合情况
caculate(10, 90, scoreHistory);
System.out.println("总共排列组合数量: " + count);
}
}
NO2 阶乘末尾0的个数?
其实乘法里面,末尾有0意味着因子中肯定有10,而10的质因子,就是5
和 2
,所以,我们要看末尾有没有5,为啥直接看阶乘中的数字的包含的5的质因子的总数就可以了?不用看2的么?主要是5比2大,如果有5的质因数,那么肯定比如包含2,比如5!:,仔细观察,5的阶乘中5的总数只有1个,但是2的总数有3个。所以我们直接看5的数量就可以了。
那么这里你肯定发现了一个问题,就是为啥在25的时候一次洗由4加到了6?其实究其原因就是,我们之前一直在找的数量,但是 也可做到后面有0。所以这里就多出了一个5的质因子的总数,因为25也是要分解成。
我们来看看代码:
class Solution {
public int trailingZeroes(int n) {
int count = 0;
while(n >= 5) {
count += n / 5;
n /= 5;
}
return count;
}
}