num

N的阶乘末尾有多少个0

浪子不回头ぞ 提交于 2020-02-03 10:49:20
N的阶乘(N!)中的末尾有多少个0? 例如:N = 5,N! = 120.末尾有1个0. 分析:想到这个问题,有人可能第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。但是转念一想,会不会溢出,等等。其实,从”那些数相乘可以得到10”这个角度,问题就变得比较的简单了。首先考虑,如果N的阶乘为K和10的M次方的乘积,那么N!末尾就有M的0。如果将N的阶乘分解后,那么N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,…..的成绩。 由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10,于是M = MIN(X,Z),不难看出X大于Z,因为被2整除的频率比被5整除的频率高的多。所以可以把公式简化为M=Z.由上面的分析可以看出,只要计算处Z的值,就可以得到N!末尾0的个数 方法一 要计算Z,最直接的方法就是求出N的阶乘的所有因式(1,2,3,…,N)分解中5的指数。然后求和 int fun1(int n) { int num = 0; int i,j; for (i = 5;i <= n;i += 5) { j = i; while (j % 5 == 0) { num++; j /= 5; } } return num; } 方法二: Z = N/5 + N /(5*5) + N/(5*5*5)…..知道N/(5的K次方

leetcode位运算

北城以北 提交于 2020-02-03 09:02:36
位运算 1,只出现一次的数字(136) 采用位运算中的异或运算,异或运算满足交换律与结合律 ^ class Solution ( object ) : def singleNumber ( self , nums ) : """ :type nums: List[int] :rtype: int """ res = 0 for i in nums : res ^ = i return res 2,颠倒二进制位(190) 采用位运算中的右移>>与左移<<操作 class Solution : # @param n, an integer # @return an integer def reverseBits ( self , n ) : res = 0 count = 32 while count : res << = 1 res += n & 1 n >> = 1 count -= 1 return int ( bin ( res ) , 2 ) 3,位1的个数(191) 采用位运算中的&操作 num&(num-1)可以消去num末尾的0 class Solution ( object ) : def hammingWeight ( self , n ) : """ :type n: int :rtype: int """ res = 0 while n : n = n & (

71-75题:304/357/367/80/168

筅森魡賤 提交于 2020-02-03 08:21:45
304. 二维区域和检索 - 矩阵不可变 思路 1.暴力法。O(mn),超时 sums = 0 for i in range ( row1 , row2 + 1 ) : for j in range ( col1 , col2 + 1 ) : sums = sums + self . matrix [ i ] [ j ] return sums 优化 1.题目要求多次求解,思路应该是每查一次将结果记录下来,之后再次计算在这些基础上再少量的加加减减。但想着不太好实现。 2.直接看官方题解,原来直接将结果全计算出来,然后简单计算得到。 思路是:| sum(abcd)=sum(od)−sum(ob)−sum(oc)+sum(oa) 看懂了官方java的思路写的python def __init__ ( self , matrix : List [ List [ int ] ] ) : self . matrix = matrix if len ( matrix ) == 0 or len ( matrix [ 0 ] ) == 0 : return None m = len ( matrix ) n = len ( matrix [ 0 ] ) sum_matrix = [ [ 0 for i in range ( n + 1 ) ] for j in range ( m + 1 ) ]

2、整数逆序的多种方法

青春壹個敷衍的年華 提交于 2020-02-03 07:22:11
2、整数逆序的多种方法 一、递归法逆序 :输入一个正整数n,将其逆序输出。要求定义和调用函数reverse(num),其功能是将num逆序输出,要求用递归实现。 二、经典常用的 :关键代码是 d = x%10; ret=ret*10 + d; 三、更简单的 :仅针对三位整数 四、更复杂的 :仅针对三位整数 五、 : 说明:x/100得x的百位数字,x%100则是去掉x的百位数字,x%10得x的个位,依此类推。 //一、递归法逆序: # include <stdio.h> void reverse ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; reverse ( n ) ; return 0 ; } void reverse ( int n ) { if ( n < 10 ) { printf ( "%d" , n ) ; } else { printf ( "%d" , n % 10 ) ; reverse ( n / 10 ) ; } } //二、经典常用的: # include <stdio.h> int main ( ) { int x , d , ret = 0 ; scanf ( "%d" , & x ) ; while ( x > 0 ) { d = x % 10 ; ret = ret * 10 +

汽车加油行驶问题(分层图最短路)

戏子无情 提交于 2020-02-03 05:56:50
汽车加油行驶问题 时空限制 1000ms / 256MB 题目描述 给定一个 N × N 的方形网格,设其左上角为起点◎,坐标 ( 1 , 1 ), X 轴向右为正, Y 轴向下为正,每个方格边长为 1 ,如图所示。 一辆汽车从起点◎出发驶向右下角终点▲,其坐标为 ( N , N )。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: 汽车只能沿网格边行驶,装满油后能行驶 K 条网格边。出发时汽车已装满油,在起点与终点处不设油库。 汽车经过一条网格边时,若其 X 坐标或 Y 坐标减小,则应付费用 B ,否则免付费用。 汽车在行驶过程中遇油库则应加满油并付加油费用 A 。 在需要时可在网格点处增设油库,并付增设油库费用 C(不含加油费用 A )。 N , K , A , B , C 均为正整数, 且满足约束: 2 ≤ N ≤ 1 0 0 , 2 ≤ K ≤ 1 0。 设计一个算法,求出汽车从起点出发到达终点所付的最小费用。 输入输出格式 输入格式: 文件的第一行是 N , K , A , B , C 的值。 第二行起是一个 N × N 的 0 − 1 方阵,每行 N 个值,至 N + 1 行结束。 方阵的第 i 行第 j 列处的值为 1 表示在网格交叉点 ( i , j ) 处设置了一个油库,为 0 时表示未设油库。各行相邻两个数以空格分隔。

图算法--套汇问题

筅森魡賤 提交于 2020-02-03 04:36:01
套汇问题 套汇是指利用货币对率的差异,把一个单位的某种货币转换为大于一个单位的同种货币的方法。例如,假定1美元可以买46.4印度卢比,1印度卢比可以买2.5日元,1日元可以买0.0091美元。通过货币兑换,一个商人可以从美元开始买入,得到46.4*2.5*0.0091=1.0556美元,因而获得5.56%的利润。 假定已知n种货币c1,c2,….,cn和有关兑换率的n*n的表R,1单位货币ci可以买入R[I,j]单位的货币cj. a) 写入一个有效算法,以确定是否存在一个货币序列<ci1,ci2,ci3,ci4,…,cik>满足 R[i1,i2]* R[i2,i3]… R[ik-1,ik] *R[ik,i1] >1 并分析算法的运行时间。 b) 写出一个有效的算法来输出该序列(如果存在这样的序列的话),并分析算法的运行时间。 解: 基本解题思想: 通过FLOYD算法求出最大环。判断最大环的权值之积是否大于1,如果大于1说明可以实现套汇,如果不大于1 说明不能实现套汇。在求解最大环的同时记录下兑换过程中的步骤。 算法实现的数据结构: int Path[MAX_VERTECX_NUM][MAX_VERTECX_NUM];//用来记录套汇过程中要经过的路径 float value[MAX_VERTECX_NUM][MAX_VERTECX_NUM];//用来记录经过讨回操作后得到的值 /

初尝图像识别

心不动则不痛 提交于 2020-02-03 04:19:47
第一次接触图像识别是在2019的亚太数学建模上当时选择的是A题 利用photoshop对图像进行处理和提取 利用Python寻找SiO2的轮廓坐标 import numpy as np num = 497 while ( num <= 610 ) : print ( num ) str1 = '%d' % num str = 'C:\\Users\\Li\\PycharmProjects\\Demo\\0' + str1 + '.jpg' img = cv2 . imread ( str ) num = num + 1 img_original = cv2 . imread ( str ) img_gray = cv2 . cvtColor ( img_original , cv2 . COLOR_BGR2GRAY ) #求二值图像 retv , thresh = cv2 . threshold ( img_gray , 125 , 255 , 1 ) #寻找轮廓 contours , hierarchy = cv2 . findContours ( thresh , cv2 . RETR_TREE , cv2 . CHAIN_APPROX_SIMPLE ) #绘制轮廓 cv2 . drawContours ( img_original , contours , - 1 , ( 0

利用python编写一个简单的猜数字游戏

天大地大妈咪最大 提交于 2020-02-03 03:49:29
print('猜数游戏') num=input('请输入你猜测的数字\n') \\input输入是字符串类型,所以我们需要在下面把类型转换为整形 guess=int(num) n=0 \\定义猜测次数,默认为0 while n<2: \\当此时小于2时,循环继续,就是说当次数超过三次后就退出游戏 if guess == 8 and n==0: \\一开始就进行判断,如果用户第一次就对了那么就直接退出循环,并打印最后一行内容 print('么么哒。对啦') print('厉害了一次就对了') break if guess < 8: \\下面就是判断是否和8一样,或者大了小了,并给出提示 print('不对哦,太小了') elif guess > 8 : print('不对哦,太大了') elif guess==8 : print('么么哒。对啦') num=input('请你重新输入\n') \\如果数值不对,总会提示你大了,或者小了,我们就匹配上了一条if语句,然后执行下面的语句 guess=int(num) n=n+1 \\每重新输入一次,都对n计数,当n>2时,退出循环 if n==1 and guess==8: \\下面对次数进行判断,and表示要两个条件为真,才执行下面的print语句,同时既然猜测出来了,就可以直接打断循环了 print('可以哦,第二次就对了')

算法(C++)字典序问题

一笑奈何 提交于 2020-02-03 03:43:17
题目描述 在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A 由26 个小写英文字母组成A={a,b,…,z}。该字母表产生的升序字符串是指字符串中字母按照从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1 次。例如,a,b,ab,bc,xyz 等字符串都是升序字符串。现在对字母表A 产生的所有长度不超过6 的升序字符串按照字典序排列并编码如下。 1 2 … 26 27 28 … a b … z ab ac … 编程任务 对于给定的长度不超过6 的升序字符串,编程计算出它在上述字典中的编码。 数据输入: 第一行是一个正整数k,表示接下来共有k 行接下来的k 行中,每行给出一个字符串。 结果输出: 共有k 行,每行对应于一个字符串的编码。 输入示例 2 a b 输出示例 1 2 分析 代码 # include <iostream> # include <cstring> using namespace std ; int order ( int i , int k ) { //第i个字母开头长度为k的数量 int j ; int sum = 0 ; if ( k == 1 ) { return 1 ; } else { for ( j = i + 1 ; j <= 26 ; j ++ ) { sum + = order ( j , k - 1 )

《计算思维导论——一种跨学科的方法》第二章习题解答

无人久伴 提交于 2020-02-03 03:02:50
v_out=v_in*pow(r_in/r_out,2) from math import pi r_cube = ( d * p ) / ( pi * S ) r = r_cube ** ( 1 / 3 ) r = r / 12 money = ( P * r * ( ( 1 + r ) ** N ) ) / ( ( ( 1 + r ) ** N ) - 1 ) y_0 = y - ( 14 - m ) / 12 x = y_0 + y_0 / 4 - y_0 / 100 + y_0 / 400 m_0 = m + 12 * ( ( 14 - m ) / 12 ) - 2 d_0 = ( d + x + ( 31 * m_0 ) / 12 ) % 7 from math import acos , sin , cos R = 6367000 x_1 , y_1 = 49.87 , - 2.33 x_2 , y_2 = 37.8 , - 122.4 d = R * acos ( sin ( x_1 ) * sin ( x_2 ) + cos ( x_1 ) * cos ( x_2 ) * cos ( y_1 - y_2 ) ) print ( f '巴黎和旧金山两点间的大圆弧距离是:{d}m.' ) # 巴黎和旧金山两点间的大圆弧距离是:5330001.193839m. v =