(笔试题)N!的三进制数尾部0的个数

题目:

用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0。

思路:

这道题与上一篇博文N!尾部连续0的个数的思路是一样的。

计算N!下三进制结果末尾有多少个0,其实就是计算三进制中的3被连续进位多少次,只要将N!因式分解成3^m*other,m就是答案。

技巧性的解法就是:m=N/3+N/(3^2)+N/(3^3)....+N/(3^k) (k<=N/3)

(三进制数:第一位满3进1,第二位满9进1,第三位满27进1。。。)

代码:

#include <iostream>

using namespace std;

long long NumOfZero(long long n){
    long long count=0;
    while(n>0){
        count+=n/3;
        n=n/3;
    }
    return count;
}

int main()
{
    long long n=30;
    cout<<NumOfZero(n)<<endl;
    return 0;
}

  

时间: 2024-08-26 15:38:10

(笔试题)N!的三进制数尾部0的个数的相关文章

C#经典笔试题-获取字符串中相同的字符以及其个数

本文来自:http://www.cnblogs.com/kejie/p/5971773.html public Dictionary<char,int> GetStrSameAs(string str){ //将字符串转换成一个字符数组. char[] charArray=str.ToCharArray(); //定义一个字典用,其中的键key作为取出的字符,值value作为对应字符的个数. Dictionary<char,int> dic=new Dictionary<ch

求阶乘结果尾部 0 的个数 Factorials and Trailing Zeroes

size_t fuck(size_t n) { double index = 1.0; size_t result = 0; while (true) { auto count = n / static_cast<size_t>(pow(5.0, index)); if(count == 0){ return result; } ++index; result += count; } } 当然,也不是我凭空想出的,之前我一直不明白为何 25!的结果是六个 0.直到看了 这篇文章 才刚反应过来,

《转》二进制与三进制的那些趣题

http://blog.csdn.net/zhuxiaoyang2000/article/details/6091767 先来思考几个问题,并不难,各位大牛应能秒杀: 1. 小明是个卖苹果的,小红一次在小明那买N(N<1024)个苹果.小明每次都要数N个苹果给小红,唉,太麻烦了.于是小明想出了一种方法:他把苹果分在10个袋子中,则无论小红来买多少个苹果,则他都可以整袋整袋的拿给小红.问怎样分配苹果到各个袋子? 2. 有16种溶液,其中有且只有一种是有毒的,这种有毒的溶液与另一种试剂A混合会变色,

(笔试题)N!尾部连续0的个数

题目: 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度.如:18!=6402373705728000,尾部连续0的个数是3. (不用考虑数值超出计算机整数界限的问题) 思路: 1.直接计算N!的值,然后统计尾部0的个数,时间复杂度O(n): 2.发散思维,想想尾部为0的数是怎么得到的? 很容易想到2*5即可得到0,则N!可以表示为k*(2^m)*(5^n),由于在N!中m>>n,因此N!=k'*(2*5)^n,即n为尾部为0的个数. 由此,我们只要考虑N!中包含多少

C/C++ 笔试题

/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问

hdu-3001 三进制状态压缩+dp

用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空间是足够的),用dp[z+bit[j]][j]=dp[z][i]+ct[i][j]就可以表示,从上一状态以i为结束点,转移到把j加入路径末端后的状态(感叹一下位运算的神奇). // // main.cpp // hdu_3001 // // Created by Luke on 2016/11/12

hdu 3001 Travelling (三进制)【状压dp】

<题目链接> 题目大意: 给出n个点和m条边,求经过所有点所需的最小花费,每个点最多经过两次. 解题分析: TSP问题类型,由于此题每个点有三种状态,所以采用三进制状态压缩,0.1.2 分别代表经过这个点的次数,然后就与TSP的dp解法类似,dp[i][j]代表状态为i,以 j 城市作为旅途的最后一个点所需的最小花费 . #include <iostream> #include <stdio.h> #include <stdlib.h> #include&l

Gym 101194L / UVALive 7908 - World Cup - [三进制状压暴力枚举][2016 EC-Final Problem L]

题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5930 题意: 现有四支队伍两两打比赛,总共就是打六场比赛,每场比赛赢的队伍可得 $3$ 分,输的队伍得 $0$ 分,平局则两个队各得 $1$ 分. 现在给出四个队伍最终的积分

经典笔试题:两个线程交替打印奇偶数

一.采用对象的wait() notify()方法实现 package com.gaopeng.programming; import java.util.concurrent.TimeUnit; /** * 经典笔试题:交替打印奇偶数 采用对象的wait() notify()方法实现 * * @author gaopeng * */ public class OddEvenThread { private static volatile Integer counter = 0; public s