精华内容
下载资源
问答
  • 1!= 1 2!= 2 3!= 6 4!= 24 5! = 120 6! = 720 ... 从5开始,末位数字都是0,所以末尾数字是 1+2+6+24 = 33; 末尾数是3 转载于:https://www.cnblogs.com/newthing/archive/2009/02/21/2157678.html...

     

    1!= 1
    2!= 2
    3!= 6
    4!= 24
    5! = 120
    6! = 720
    ... 从5开始,末位数字都是0,所以末尾数字是 1+2+6+24 = 33;

    末尾数是3

    转载于:https://www.cnblogs.com/newthing/archive/2009/02/21/2157678.html

    展开全文
  • 1!... 从5开始,末位数字都是0,所以末尾数字是 1+2+6+24 = 33;  <br />末尾数是3   原文链接:http://hi.baidu.com/%C2%B7%C4%CF%C6%BD/blog/item/11e542096e4ce0a62eddd4ea.html

    1!= 1 
    2!= 2 
    3!= 6 
    4!= 24 
    5! = 120 
    6! = 720 
    ... 从5开始,末位数字都是0,所以末尾数字是 1+2+6+24 = 33; 

    末尾数是3

     

    原文链接:http://hi.baidu.com/%C2%B7%C4%CF%C6%BD/blog/item/11e542096e4ce0a62eddd4ea.html

    展开全文
  • N!的最末位非零数

    2015-05-04 23:35:00
    由于在末尾只有25相乘才能产生0,如果我们把25抛去,那么肯定不会有0,这样就可以一边乘一边模10,防止溢出。剩下的一堆25如何处理呢?因为2肯定比5多,因此最末位肯定是偶数(0的阶乘1的阶乘除外
    
      给定一个数N(N <= 10 ^ 1000),如何快速求得N!的最末位非零数是一个经典的问题。一直以来都被这个问题困扰,今天仔细想了下,终于给想通了,尽管可能有些笨拙,现把想法记录于此。
      在N很小的情况下,有一个简便的方法:求出1到N之间每个数的2的因子数和5的因子数,记为F(2)和F(5),显然F(2) >= F(5)。由于在末尾只有2和5相乘才能产生0,如果我们把2和5抛去,那么肯定不会有0,这样就可以一边乘一边模10,防止溢出。剩下的一堆2和5如何处理呢?因为2肯定比5多,因此最末位肯定是偶数(0的阶乘和1的阶乘除外)。而一个偶数不停地乘2,最末位的规律是:2 -> 4 -> 8 -> 6 -> 2 -> ...出现了4位1循环,这样我们先用F(2) - F(5),使得一部分2和5匹配上,2 * 5 = 10,对末尾不产生影响,剩下的2就模一下4,剩几再乘几次2就可以了。
      但是这个方法在N非常大的时候肯定就不行了,但是可以利用找循环这个思想继续做。如果算阶乘的时候跳过5的倍数,记G(n)为跳过5的倍数的时候,从1乘到n的最末非零位,也就是把5的倍数当1乘。可以发现:
    G(1) = 1, G(2) = 2, G(3) = 6, G(4) = 4, G(5) = 4, G(6) = 4, G(7) = 8, G(8) = 4, G(9) = 6, G(10) = 6, G(11) = 6, G(12) = 2, G(13) = 6...
      又出现了循环,每10个数循环一次。如何计算G(n)就变的很简单,求出n的最末位,就知道对应的G(n)是多少了,当然需要特判n = 1的情况。由于我们把5的倍数的数都提出来了,提出来的这些数(5、10、15、20、25、30...)每个除以5后又组成了一个阶乘序列!除完5一共提出了n / 5个5,根据之前的分析,每个5都可以拿出一个2和它配对然后把它消去,这样一个5就相当于少一个2,我们就要把原来的数乘以3个2(模四循环)。这样一来5的个数其实也可以模四,模完四之后剩k的话,就可以乘以k个8,就把所有的5消去了。现在总结一下:对一个数n的阶乘,计算它的末尾非零位,先计算G(n),相当于非5的倍数的数的乘积最末非零位先算好了,然后乘以n / 5 % 4个8,处理了提出的n / 5个5,这样之后还剩下n / 5的阶乘没有算。递归的求解n / 5的阶乘的最末位非零数,再乘上去就得到结果了。
      这个做法的复杂度就很低了,达到O(log n),对于10 ^ 1000的数据,利用高精度做就行了。利用这种循环的思想,算排列数P(n, k)的最末非零数也就可以做到了。
    附HOJ 1013代码:
     1#include <cstdio>
     2#include <cstring>
     3const int N = 1024;
     4
     5int hash[10= {6626444846};
     6int one_digit_hash[10= {1126422428};
     7
     8int last_digit(char str[N], int st, int to)
     9{
    10    int i, tmp = 0, ret, num_of_five = 0;
    11
    12    if (st == to)
    13        return one_digit_hash[str[st]-'0'];
    14
    15    ret = hash[str[to]-'0'];
    16    for (i = st; i <= to; i++)
    17    {
    18        tmp = tmp * 10 + str[i] - '0';
    19        str[i] = tmp / 5 + '0';
    20        tmp %= 5;
    21        num_of_five = (num_of_five * 10 + str[i] - '0'% 4;
    22    }

    23    if (str[st] == '0')  st++;
    24    ret = last_digit(str, st, to) * ret % 10;
    25    while (num_of_five--)   ret = ret * 8 % 10;     //mul one 5 equals mul one 8
    26
    27    return ret;
    28}

    29
    30int main()
    31{
    32    char str[N];
    33
    34    while (scanf("%s", str) == 1)
    35        printf("%d\n", last_digit(str, 0, strlen(str) - 1));
    36
    37    return 0;
    38}
    展开全文
  • 1.滑动窗口的最大值 题目描述: 给定一个数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。...输入: nums = [1,3,-1,-3,5,3,6,7], k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 ...

    1.滑动窗口的最大值

    题目描述:

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

    返回滑动窗口中的最大值。

     

    示例:

    输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
    输出: [3,3,5,5,6,7] 
    解释: 

      滑动窗口的位置                最大值
    ---------------               -----
    [1  3  -1] -3  5  3  6  7       3
     1 [3  -1  -3] 5  3  6  7       3
     1  3 [-1  -3  5] 3  6  7       5
     1  3  -1 [-3  5  3] 6  7       5
     1  3  -1  -3 [5  3  6] 7       6
     1  3  -1  -3  5 [3  6  7]      7
     

    提示:

    你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。

    解题思路:

    单调队列的三个操作:1.队尾添加元素。2.返回当前队列中的最大值。3.队头元素如果是n,删除它。。。当然这几个操作的时间复杂度都是O(1)。

    class Solution {
    public:
    
        class MonotonicQueue{
        private:
            deque<int> data;
        public:
            void push(int n){
                while(!data.empty()&&data.back()<n){
                    data.pop_back();
                }
                data.push_back(n);
            }
            int max(){
                return data.front();
            }
            void pop(int n){
                if(!data.empty()&&data.front() == n){
                    data.pop_front();
                }
            }
        };
    
        vector<int> maxSlidingWindow(vector<int>& nums, int k) {
            MonotonicQueue window;
            vector<int> res;
            for(int i = 0;i<nums.size();++i){
                if(i<k-1){
                    window.push(nums[i]);
                }
                else{
                    window.push(nums[i]);
                    res.push_back(window.max());
                    window.pop(nums[i-k+1]);
                }
            }
            return res;
        }
    };
    

     

     

     

    2.加一

    题目描述:

    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

    最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

    你可以假设除了整数 0 之外,这个整数不会以零开头。

    示例 1:

    输入: [1,2,3]
    输出: [1,2,4]
    解释: 输入数组表示数字 123。
    示例 2:

    输入: [4,3,2,1]
    输出: [4,3,2,2]
    解释: 输入数组表示数字 4321。

    class Solution {
    public:
        vector<int> plusOne(vector<int>& digits) {
            for(int i = digits.size()-1;i>=0;--i){
                if(digits[i] == 9){
                    digits[i] = 0;
                }
                else{
                    digits[i]++;
                    break;
                }
            }
            if(digits[0] == 0){
                digits[0] = 1;
                digits.push_back(0);
            }
            return digits;
    
        }
    };

     

     

     

     

     

     

     

     

    展开全文
  • 1024!末尾有几个零

    2013-07-12 15:55:36
    不是5的倍数无论哪个相乘都不可能出现个位为0的结果。 25 * 4 = 100,能产生两个0,同理(75 = 25 * 3 = 5 * 5 *3)* 4 = 300;(125 = 5 * 5 * 5 )* 8 = 1000; 即一个数包含多少个因子5其就可以同足够的...
  • * 一个数的(4n+1)次方之后末尾和初始相同 */ import java.util.Scanner; public class Main1097 { public static void main(String[] args) { Scanner sc = new Scanner(System.in);
  • 1024!末尾有几个零?

    2014-10-20 21:48:06
    1024可计为N 解题方法有两种: 一、使用大整数运算,也算是“暴力求解”了。但只看可能的求解长度就下一跳啊。...N以内的偶数个数肯定是大于5倍数的个数的(5偶数相乘才可能增加末位0的个数)。 所以有a
  • int Factorial(int N) { int nNum = 0; while (N) { if (N%5 == 0) { nNum++; } N--; } return nNum; }理由是:由于只有2*5才可能出现末尾为0的情况,所以只需要考虑25的个数就可以
  • 【小记】移位运算符 >> & >>= |=

    千次阅读 2019-06-12 13:38:14
    比如十进制数 10,在末位补 0 等于 100,相当于原数乘 10,所以 x << 1 就是将二进制的 x 左移一位,比如 4 的二进制为 100,末尾补 0 等于 1000 即十进制数的 8. >> 右移:高位补 0,原数除以 2 比如十...
  • **1:splice: array.splice(index , howMany[, element1[, ...[, elementN]]]) array.splice(index) // SpiderMonkey/Firefox extension 参数 index 从数组的哪一位开始...如果是负值,则表示从数组末位开始的...
  • 1 Array.prototype.splice() 方法通过删除或替换现有元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。 语法:array.splice(start[, deleteCount[, ...如果是负值,则表示从数组末位开始的第几位...
  • GB/T 8170-2008 数值修约规则与极限数值的表示判定 3.2进舍规则 1、拟舍弃数字的最左一位数字小于5,则舍去,保留其余各位数字不变; 2、拟舍弃数字的最左一位数字大于5,则进一,即保留数字的末尾数字加1...
  • * 基本思路:将两个字符串转化为int数组然后我们平常算两个数相加一样,从末尾开始加进位 * 需要注意的是: * ①结果总和大的那个数位数一样或者比它多一位,看最后result[0]的值如果为0就不要计入结果中 * ②...
  • 思想:通过一次遍历,找出最大值,和最小值,储存它们的下标,然后将最小值和首位交换,然后将最大值和末位交换,然后将首位向后移动一位,末尾向前移动一位。然后直到首位和末尾相遇时停止,前面为小,后面为大。...
  • 1. 100的阶乘,末尾有几个连续的零?(如:2100的最后有2个零) 2. 1到100的阶乘的末位数是几? 3. 10000的阶乘,末尾有多少个连续的零?
  • 弱省互测#2 t3

    2019-09-25 18:13:36
    题意 给出\(n\)个01字节\(m\)个01字节,要求用后者去匹配前者,两个串能匹配当且仅当除了每个字节末位不同,其他位都要相同。问匹配后者至少有多少个末位...我们将末尾的位提取出来,则考虑\(n\)个\(01\)位\(...
  • 2 1到100的阶乘的末位数是几? 3 10000的阶乘,末尾有多少个连续的零? 解答分析: 1 100的阶乘,末尾有几个连续的零? 答案是24。 思路有两个: 先讲笨方法,采用分类讨论的方法。你可以知道100的...
  • N!最末非零位数值

    2013-11-10 02:22:18
    由于在末尾只有25相乘才能产生0,如果我们把25抛去,那么肯定不会有0,这样就可以一边乘一边模10,防止溢出。剩下的一堆25如何处理呢?因为2肯定比5多,因此最末位肯定是偶数(0的阶乘1的阶乘除外)。而一个...
  • POJ 3617 Best Cow Line

    2018-10-24 19:19:46
    但是我们还得处理一种开头和末尾相同的情况,我们必须保证尽早取到最小的。所以我们可以用两个指针分别从开头和末尾逐位比较。那边先出现较小的,就先取那边的。 #include&lt;cstdio&gt; #include&lt;...
  • LightOJ1138 Trailing Zeroes (III) 标签 二分 ...一个数末尾有q个0,意味着对这个数质因数分解,25的指数的最小值==q。 注意到在n!中, 注意事项 总结 一个数末尾有q个0,意味着对这...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

末尾和末位