阶乘算法全集,阶乘末尾非零位,阶末尾零的个数(转)

数学总结之关于阶乘的几种问题 有关阶乘的算法,不外乎两个方面:一是高精度计算;二是与数论相关。                                                     一. 高精度计算阶乘这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算。首先看小于等于12的阶乘计算(计算结果不会超出32位范围):        int factorial(int n)       ... 阅读详情
//阶乘各算法的 C++ 类实现
#include <iostream>
#include 
<cstring>
#include 
<iomanip> 
#include 
<cmath> 
using namespace std;
 
class Factorial {
    
static const int MAXN = 5001;                          // 最大阶乘数,实际用不到这么大 
    int *data[MAXN];                                            // 存放各个数的阶乘
    int *nonzero;                                                 // 从低位数起第一个非0数字 
    int maxn;                                                       // 存放最大已经计算好的n的阶乘 
    int SmallFact(int n);                                         // n <= 12的递归程序 
    void TransToStr(int n, int *s);                           // 将数n倒序存入数组中 
    void Multply (int* A, int* B, int* C, int totallen);   // 执行两个高精度数的乘法
public:
    Factorial();
    
~Factorial();
    
void Calculate(int n);                                       // 调用计算阶乘 
    int FirstNonZero(int n);                                    // 返回阶乘末尾第一个非0数字 
    int CountZeros(int n);                                     // 返回阶乘末尾有多少个0 
    int SecondNum(int n);                                    // 返回阶乘左边的第二个数字 
    bool CanDivide(int m, int n);                            // 判断数值 m 是否可以整除 n! 
    void Output(int n) const;
}; 
   
int Factorial::SmallFact(int n) {
    
if (n == 1 || n == 0) return 1;
    
return SmallFact(n-1)*n;
}    
 
void Factorial::TransToStr(int n, int *tmp) {
    
int i = 1;
    
while (n) {
        tmp[i
++] = n%10;
        n 
/= 10;
    }    
    tmp[
0] = i-1;
}   
 
void Factorial::Multply (int* A, int* B, int* C, int totallen) 
{
    
int i, j, len;    
    memset(C, 
0, totallen*sizeof(int));    
    
for (i = 1; i <= A[0]; i++)
    
for (j = 1; j <= B[0]; j++) {
        C[i
+j-1] += A[i]*B[j];                                 // 当前i+j-1位对应项 + A[i] * B[j]
        C[i+j] += C[i+j-1]/10;                                // 它的后一位 + 它的商(进位) 
        C[i+j-1] %= 10;                                        // 它再取余即可 
    }
    len 
= A[0] + B[0];    
    
while (len > 1 && C[len] == 0 ) len--;             // 获得它的实际长度 
    C[0] = len;   
}  
 
Factorial::Factorial() {                                       
// 构造函数,先把<=12的阶乘计算好 
    maxn = 12; data[0] = new int [2];
    data[
0][0] = 1; data[0][1] = 1;
    
int i, j = 1;
    
for (i = 1; i <= 12; i++) {
        data[i] 
= new int [12];
        j 
= j*i;
        TransToStr(j, data[i]);
    }    
    nonzero 
= new int [10*MAXN];
    nonzero[
0] = 1; nonzero[1] = 1;                  // nonzero[0]存储已经计算到的n!末尾非0数 
}
 
Factorial::
~Factorial() {
    
for (int i = 0; i <= maxn; i++)
        delete [] data[i];
    delete [] nonzero; 
}    
 
void Factorial::Calculate(int n) {
    
if (n > MAXN)  return;     
    
if (n <= maxn) return;                               // <= maxn的,已经在计算好的数组中了 
    int i, j, len;
    
int tmp[12];
    
for (i = maxn+1; i <= n; i++) {
        TransToStr(i, tmp);
        len 
= data[i-1][0] + tmp[0] + 1;
        data[i] 
= new int [len+1];
        Multply(data[i
-1], tmp, data[i], len+1);
    }
    maxn 
= n;
}
 
int Factorial::FirstNonZero(int n) {
    
if (n >= 10*MAXN) {
        cout 
<< "Super Pig, your input is so large, cannot Calculate. Sorry! ";
        
return -1;
    }     
    
if (n <= nonzero[0]) return nonzero[n];      //已经计算好了,直接返回

    
int res[5][4] = {{0,0,0,0}, {2,6,8,4}, {4,2,6,8}, {6,8,4,2}, {8,4,2,6}};
    
int i, five, t;
    
for (i = nonzero[0]+1; i <= n; i++) {
        t 
= i;
        
while (t%10 == 0) t /= 10;                  // 先去掉 i 末尾的 0,这是不影响的 
        if (t%2 == 0) {                                   // t是偶数直接乘再取模10即可 
            nonzero[i] = (nonzero[i-1]*t)%10; 
        }     
        
else {                                                // 否则转换成 res 数组来求 
            five = 0;
            
while (t%5 == 0) {
                
if (five == 3) five = 0;
                
else five++;
                t 
/= 5; 
            }     
            nonzero[i] 
= res[((nonzero[i-1]*t)%10)/2][five];
                            
// (nonzero[i-1]*t)%10/2 正好序号为:1, 2, 3, 4 中的一个 
        }     
    } 
    nonzero[
0] = n; 
    
return nonzero[n]; 
}  
 
/* 阶乘末尾有多少个0,实际上只与5的因子数量有关,即求 n/5+n/25+n/625+...... */
int Factorial::CountZeros(int n) {
    
if (n >= 2000000000) {
        cout 
<< "Super Pig, your input is so large, cannot Calculate. Sorry! ";
        
return -1;
    }   
    
int cnt = 0;
    
while (n) {
        n 
/= 5;
        cnt 
+= n;
    }
    
return cnt; 
} 
 
/*  输出N!左边第二位的数字:用实数乘,超过100就除以10,最后取个位即可  */
int Factorial::SecondNum(int n) {
    
if (n <= 3) return 0; 
    
int i; 
    
double x = 6;
    
for (i = 4; i <= n; i++) {
        x 
*= i;
        
while (x >= 100) x /= 10; 
    }
    
return (int(x))%10; 
}     
 
bool Factorial::CanDivide(int m, int n) {
    
if (m == 0) return false;
    
if (n >= m) return true; 
    
int nn, i, j, nums1, nums2;
    
bool ok = true; 
    j 
= (int)sqrt(1.0*m);
    
for (i = 2; i <= j; i++) {
        
if (m%i == 0) {
            nums1 
= 0;                                       // 除数m的素因子i的数量 
            while (m%i == 0) {
                nums1
++;
                m 
/= i;
            } 
            nums2 
= 0; nn = n; 
            
while (nn) {                                      // 求 n 含有 i 因子的数量 
                nn /= i;
                nums2 
+= nn; 
            }  
            
if (nums2 < nums1) {                        // 少于m中所含i的数量,则m肯定无法整除n! 
                ok = false;
                
break; 
            }   
            j 
= (int)sqrt(1.0*m);                         // 调整新的素因子前进范围 
        }    
    } 
    
if (!ok || m > n || m == 0) return false; 
    
else return true; 
}      
 
void Factorial::Output(int n) const {
    
if (n > MAXN) {
        cout 
<< "Super Pig, your input is so large, cannot Calculate. Sorry! ";
        
return;
    }     
    
int i, len = 8;
    cout 
<< setw(4) << n << "! = ";              // 格式控制输出 
    for (i = data[n][0]; i >= 1; i--) {
        cout 
<< data[n][i];
        
if (++len == 58) {                               // 实际每输出50个字符就换行 
            len = 8;
            cout 
<< "         ";
        }    
    }    
    
if (len != 8) cout << endl;
}    
 
int main() {
    
int n, m, i;
    Factorial f;
    
while (cin >> n) {
        f.Calculate(n);
        f.Output(n);
        cout 
<< "该阶乘末尾第一个非0数字是: " << f.FirstNonZero(n) << endl; 
        cout 
<< "该阶乘总共拥有数字0的个数:" << f.CountZeros(n) << endl;
        cout 
<< "该阶乘的左边的第2位数字是:" << f.SecondNum(n) << endl; 
        cin 
>> m;
        
if (f.CanDivide(m, n)) cout << m << " 可以整除 " << n << "! ";
        
else cout << m << " 不能整除 " << n << "! ";  
    }
    
return 0;    
}
 
//第2部分第(5)个算法的单独实现
#include<stdio.h>
 
int A[10] = {1,1,2,6,24,120,720,5040,40320,362880};
int ans[1024];
int sum;
 
void insert(int* a, int x) {                              // 插入排序,插成有序表
    int i, j;
    
for (i = 1; i <= a[0]; i++)
        
if (a[i] >= x) break;
    
if (i <= a[0] && a[i] == x) return;              // 如果相等,则不用插入 
    if (i > a[0]) {
        a[
++a[0]] = x;
    }     
    
else {
        
for (j = a[0]++; j >= i; j--)
            ans[j
+1] = ans[j]; 
        ans[i] 
= x; 
    }     
    
if (a[0] == 1023) printf(" Array Overflow! "); 
} 
    
void search(int n){
    
for (int i = n; i <= 9; i++){
        sum 
+= A[i]; if (sum > 1) insert(ans, sum); 
        
if (i < 9) search(i+1);
        sum 
-= A[i]; 
    }     
}  
 
int main(){
    
int n,i;
    ans[
0] = 1; ans[1] = 1;                                     //初始化ans数组,ans[0]表示表长
    search(0); 
    
//printf("len = %d ", ans[0]); 
    while(1){
        scanf(
"%d",&n);
        
if(n < 0)break;
        
if(n > 409114){ printf("NO ");continue;}
        
        
for (i = 1; i <= ans[0]; i++)
            
if (ans[i] == n) {printf("YES "); break;}
            
else if (ans[i] > n) {printf("NO "); break;} 
    }  
    
return 0;   
}
//
 阶乘相关算法及程序
  有关阶乘的算法,不外乎两个方面:一是高精度计算;二是与数论相关。
一. 高精度计算阶乘

    这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算。

    首先看小于等于12的阶乘计算(计算结果不会超出32位范围):

        
int factorial(int n) {

           
if (n == 1 || n == 0) return 1;

           
return factorial(n-1)*n;

       }

    这个递归程序简单明了,非常直观,然而一旦n 
> 12,则超过32位int型的范围出现错误结果,所以上面这个递归程序仅适合n <= 12的阶乘计算,为了计算较大n的阶乘,需要将高精度乘法算法纳入到阶乘计算中来,高精度乘法过程可以如下简单的描述:(其中A * B = C,A[0], B[0], C[0]分别存储长度)

    
for (i = 1; i <= A[0]; i++)

    
for (j = 1; j <= B[0]; j++) {

        C[i
+j-1] += A[i]*B[j];          // 当前i+j-1位对应项 + A[i] * B[j]

        C[i
+j] += C[i+j-1]/10;         // 它的后一位 + 它的商(进位) 

        C[i
+j-1] %= 10;                  // 它再取余即可 

    }

    C[
0] = A[0] + B[0];

    
while (C[0] > 1 && C[C[0]] == 0) C[0]--;   // 去头0,获得实际C的长度

有了这个高精度乘法之后,计算阶乘就可以简单的迭代进行:
    
for (i = 2; i <= n; i++) {

          将i转换成字符数组;

          执行高精度乘法:将上一次结果乘上i

    }

二. 与数论有关

    由于阶乘到后面越来越大,巧妙的利用数论求得一些有趣的数字(数值)等成为阶乘算法的设计点,下面给出几道相关的问题与分析:

(
1)   计算阶乘末尾第一个非0数字:

这是一个比较经典的问题,比较复杂的算法是利用一个艰难的数学公式,可惜我不会,从网上的资料学习中,整理出下面这个简单易懂的算法:

观察n
!,可以发现在乘的过程中,对于任意 n > 1,n!的末尾第一个非0数字都是偶数。我们只需保留最后一位非零数。当要乘的数中含有因数5时,我们可以把所有的因数5都当作8来乘。这是因为:

...x2
*5=...10(舍)或...60,最后一位非零数为6。而恰好2*8=16,末位为6。

...x4
*5=...70(舍)或...20,最后一位非零数为2。而恰好4*8=32,末位为2。

...x6
*5=...30(舍)或...80,最后一位非零数为8。而恰好6*8=48,末位为8。

...x8
*5=...90(舍)或...40,最后一位非零数为4。而恰好8*8=64,末位为4。

(对于n 
> 1时,最后一位不会出现 1, 7, 3, 9,而永远是2, 4, 6, 8的循环出现)

    因此,在迭代作乘法时,主要就是计算因子5的数量,同时可见因子5的个数以4为循环节(即只需要取它的数量对4取模)。那么对于不同情况下的因子5的数量,可以通过res[
5][4] = {{0,0,0,0}, {2,6,8,4}, {4,2,6,8}, {6,8,4,2}, {8,4,2,6}}来得到,使用nonzero[i]表示i的阶乘的最后一位,那么:

    如果t是偶数,则直接乘:nonzero[i] 
= (nonzero[i-1]*t)%10。

    否则nonzero[i] 
= res[((nonzero[i-1]*t)%10)/2][five]; 

其中t是除掉所有因子5的结果,five为因子5数量对4的模。相关题目:

http:
//acm.zju.edu.cn的第1222题。不过这一道题注意的是,它的输入n并非只在32位int数值范围内,而是有很大的长度,所以计算这道变态题目时,需要利用到高精度除法(n/=5)和高精度加法(cnt+=n)。

(
2). 阶乘末尾有多少个0

    分析发现,实际上形成末尾0,就是因子5的数量,而计算1
~n之间包含一个因子i的个数的简单算法就是:

cnt 
= 0; while (n) { n /= i; cnt += n; }

因此,直接将i换成5,就可以得到因子5的数量,也即n
!末尾0的数量。相关题目:http://acm.zju.edu.cn的第2022题。

(
3). 返回阶乘左边的第二个数字

    简单算法:用实数乘,超过100就除以10,最后取个位即可。因为整数部分的个位就是阶乘结果左边的第二个数字。相关题目:

http:
//acm.tongji.edu.cn的1016题。

(
4). 判断数值 m 是否可以整除 n!

算法:使用素因子判断法

A. 首先直接输出两种特殊情况:

m 
== 0 则0肯定不会整除n!;

n 
>= m 则m肯定可以整除n!;

B. 那么就只剩最后一种情况:m 
> n,我们从m的最小素因子取起,设素因子为i那么可以求得m的素因子i的个数 nums1;再检查闭区间 i ~ n 之间的数,一共包含多少个素因子i,就可以简单的利用上面(2)中所介绍的数学公式进行计算得到nums2。如果nums2 < nums1,就表示1 ~ n中包含素因子的数量 < 除数m包含素因子i的数量,那么m必然不能整除n!,置ok = false。

C. 最后:如果 
!ok or m > n or m == 0 则不能整除;否则可以整除

相关题目:http:
//acm.zju.edu.cn的第1850题。

(
5).数字N能否表示成若干个不相同的阶乘的和:

    这里可以选择的阶乘为:
0! ~ 9!,实际上这一题与数论无关,与搜索有关。相关题目:http://acm.zju.edu.cn 的2358题。

    分析,由于可供选择的阶乘数量较少,直接可以利用DFS搜索来做:

A. 首先将0 
~ 9的阶乘作一个表A[10];再设置一个可以组成“和”的数组ans[N]。

B.  深度优先搜索方法:

     search(n) {

         
for(i = n; i <= 9; i++) {

             sum 
+= A[i];        //求和

             如果sum在ans数组中不存在,则将sum插入到ans[]数组中

             search(n
+1);

             sum 
-= A[i];         //回溯

         }

}

C. 最后对于输入n,就在ans数组中查找是否存在n,如果存在,则表示n可以表示成不同的阶乘和,否则不行。

 
阶乘的末尾(非零位)⭐ 题目描述 N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。 输入 共一行,一个整数不大于4,220的整数N。 输出 共一行,输出N!最后面的非零位。 样例输入 7 样例输出 <span style=... 阅读详情

相关推荐

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 880

求一个阶乘最后面一个非零数

求一个阶乘最后面一个非零数 Description N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=12345=120所以5!的最后面的非零位是2,7!=1234567=5040,所以最后面的非零位是4。 Input 共一行,一个整数不大于4,220的整数N。 Output 共一行,输出N!最后面的非零位。 Sample Input 7 Sample Output 4 老

elexiangchirou的博客 1233

pyinstaller+scrapy打包出现错误:OSError: could not get source code

错误如下: Traceback (most recent call last): File "scrapy\utils\defer.py", line 55, in mustbe_deferred File "scrapy\core\spidermw.py", line 60, in process_spider_input File "scrapy\core\scraper.py", line 152, in call_spider File "scrapy\utils\misc.py

kin的博客 1759

记一个有趣的算法题:求n的阶乘最后一位非零数字

今天领导录题的时候问了一个题,使我陷入了迷茫。原题目是这样的:给出n,求n的阶乘的结果的最后一位非零数字,和末尾0的个位数。例如n=12n=12n=12, 则n!=1×2×...×12=479001600n!=1\times 2\times ... \times 12=479001600n!=1×2×...×12=479001600,则其最后一位非零数字为6,末尾0的个数为2。 思路1(正确) 这个思路是领导刚问我时我首先想到的,但是是一个比较笨而且复杂度较高的方法。时间复杂度O(n(logn)2)O(n(

雪的期许 3335

【SoloPi】SoloPi使用2-功能使用,录制回放

Soloπ是什么 Soloπ是一个无线化、非侵入式的Android自动化工具,公测版拥有录制回放、性能测试、一机多控三项主要功能,能为测试开发人员节省宝贵时间。 录制回放功能 Soloπ拥有录制操作的能力,用户只需要通过Soloπ执行用例步骤,Soloπ就能够将用户的操作记录下来,并且支持在各个设备上进行回放,这一切都能够在手机上独立完成。 ...

q_Catherine的博客 5828

ChatGPT Windows桌面版:从安全下载到高效配置的全流程指南

WebView封装技术是将网页应用转化为独立桌面程序的核心方法,它通过嵌入浏览器内核实现跨平台功能复用。其原理在于利用Electron或Tauri等框架,将Web内容打包进原生应用外壳,同时注入系统级API调用能力。这项技术的工程价值在于显著提升了Web应用的系统集成度和用户体验,使其能够支持全局快捷键、独立进程和本地数据存储等原生特性。在AI助手深度集成工作流的应用场景中,这种封装模式解决了浏览器多标签页切换繁琐、会话管理不便等痛点。本文以ChatGPT桌面客户端为例,详细解析了基于开源项目的安全下载路径

weixin_30437847的博客 480

N!(N的阶乘)最末位非0的求解方法

问题是求关于N!的最后一位非0位, 如3!=6,最后一位非0位为6, 5!=120, 最后一位非0位为2.怎么样快速的求出最后一位非0位呢? 最朴素的想法就是先求出N!的结果,再求出结果的最后一位非0位.当N比较小时,是可以承受的,但是当N达到一定规模的时候,时间,空间都不会太理想.这里需要一些技巧.既然是求最后一位非0位,我们就可以先除去所有对结果没有影响的...

weixin_30435261的博客 910

STM32H7 Flash擦除后数据读取异常的缓存问题解析

本文深入分析了STM32H7系列芯片在Flash擦除后数据读取异常的缓存问题,揭示了由于数据缓存(D-Cache)和指令缓存(I-Cache)导致的数据一致性问题。通过详细的解决方案,包括手动维护缓存一致性和操作期间禁用缓存,帮助开发者有效解决这一常见但棘手的嵌入式开发难题。

weixin_29158413的博客 392

阶乘算法全集,阶乘末尾非零位,阶末尾零的个数

/阶乘各算法的 C++ 类实现 #include iostream> #include cstring> #include iomanip>  #include cmath>  using namespace std;   class Factorial {     static const int MAXN = 5001; // 最大阶乘数,实际用不到这么大    

CFZero的专栏 1412

手把手教你修改miniwiggler配置信息,解决UDE连接问题(附FT_PROG工具下载)

本文详细介绍了如何使用FT_PROG工具修改miniwiggler配置信息,解决UDE连接问题。通过分析FT2232芯片的EEPROM结构,提供从驱动安装到配置烧写的完整流程,帮助开发者实现无缝连接英飞凌TriBoard开发板。文章还包含常见错误解决方案和高级批量配置技巧。

weixin_30919429的博客 373

D类功放LC滤波器实战:从Q值0.707到EMI优化的完整设计流程

本文详细解析了D类功放LC滤波器的完整设计流程,从确定截止频率与Q值0.707的理论基础出发,到参数计算、仿真验证及关键元器件选型,并提供了应对EMI超标和过流保护等实际问题的进阶调试策略。文章强调,精准的LC滤波器设计是平衡音质、稳定性与电磁兼容性的关键,尤其需关注电感饱和电流与电容直流偏置等细节。

e4f5g6h7的博客 1034

java 阶乘尾部的零,阶乘算法全集,阶乘末尾非零位,阶末尾零的个数

阶乘相关算法及程序有关阶乘的算法,不外乎两个方面:一是高精度计算;二是与数论相关。一.高精度计算阶乘这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算。首先看小于等于12的阶乘计算(计算结果不会超出32位范围):intfactorial(intn){if(n==1||n==0)return1;returnfactorial(n-1)*n;}这个递归程序简单明了,非常...

weixin_39766071的博客 353

振动能量采集技术:从原理到实战,破解物联网供电难题

能量采集技术旨在捕获环境中的废弃能量(如机械振动、热能、光能)并将其转化为电能,其核心原理在于通过压电、电磁、静电或摩擦电等物理效应实现能量形式的转换。这项技术的核心价值在于为物联网(IoT)中难以布线或更换电池的分布式传感器节点、植入式医疗设备等提供近乎永续的电力解决方案,从而解决物联网部署的“最后一米供电”瓶颈。其应用场景广泛覆盖工业预测性维护、结构健康监测、可穿戴设备及消费电子等领域。本文聚焦于振动能量采集这一细分方向,深入剖析了压电式、电磁式、电容式及摩擦纳米发电机(TENG)等主流技术路线的实战考

weixin_42660494的博客 565

获取阶乘最后一个非零位

题目描述 输入N,求N!末尾的第一个非零数字。如6 ! = 720,因此6的阶乘末尾的非零位是2。 输入描述: 仅一行,包含一个整数N(0<=N<=10,000,000) 输出描述: 仅一行,包含一个整数,表示最右边的非零的值 输入例子1: 6 输出例子1: 2 例子说明1: 6 ! = 720 题解 简单的解法没看懂,所以就先求阶乘值,然后再取最后一个非零数字 p...

qq_38311489的博客 2067

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【蓝桥杯】算法提高 计算超阶乘(C++)

ADV-362 计算超阶乘问题描述思路分析代码实现 问题描述 题目链接:计算超阶乘 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述   计算1*(1+k)(1+2k)(1+3k)…(1+n*k-k)的末尾有多少个0,最后一位非0位是多少。 输入格式   输入的第一行包含两个整数n, k。 输出格式   输出两行,每行一个整数,分别表示末尾0的个数和最后一个非0位。 样例输入 15 2 样例输出 0 5 数据规模和约定   1<=k<=10,1<=n<=1

ll_wang的博客 975

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

poj1401,洛谷1134,阶乘0的个数与最后的非零位

poj1401,阶乘末尾0的个数。 #include &lt;cstdio&gt; using namespace std; // 有多少个5,就有多少个0,对于5的处理,有多少个5就需要处理多少次。因此不断计算n/5. int main() { int x,n,ans; scanf("%d",&amp;n); while (n--) { scanf("%d",&a...

lengxuenong的博客 461

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NYOJ1026 阶乘末尾非0 【模板】

阶乘末尾非0 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述我们的问题很是简单,n!末尾非0数是几? 比如n=5的时候,n!=120,那么n!末尾非0数是2. 输入多组数据, 每组数据占一行,每行一个整数0 输出n!末尾非0数。 样例输入 5 样例输出 2 直接用的网上的模板 /*=========

长风的专栏 1321

13.求阶乘结果0的个数 26.阶乘最后的非0位 14.求怪数 17.T的倍数

scanf函数的返回值是成功读取的项数。例如,如果您调用scanf("%d", &a)并输入一个整数,那么scanf将返回1,因为它成功地读取了一个项。提示:在乘积中,末尾有多少个0,主要看各乘数的素数因子中有多少个2和5,每一个2和5的结合将给末尾贡献一个0。而乘数中因子2的个数远多于因子5的个数,因此,就计算各乘数中因子5的个数即可。每组输入数据由一行组成,每行由一个正整数N组成,N小于等于100000,在行首和行尾没有多余的空格。我们输入一组数据后即进行处理,然后输出,再输入下一组,再处理、输出。

2402_85351626的博客 540

阶乘非零末尾

问题概括 给定一个数,让你求出这个数阶乘的非零末位。 解题思路 1求出阶乘的结果 2将结果末尾的0去掉(因为对结果无影响,且方便计算) 3取出非零结果的末几位(加大运算范围) 4输出结果 程序代码 #include<iostream> using namespace std;//使用namespace int a,c,i;//设置变量a,c,i int main()//主函数的起始 {...

brucexing007的博客 1154

阶乘最后的非0位

N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=12345=120所以5!的最后面的非零位是2,7!=1234567=5040,所以最后面的非零位是4。 输入说明 : 一个不大于1000的整数N。 输出说明 : 共一行,输出N!最后面的非零位。 输入范例 : 7...

cjj_123123的博客 485

23 阶乘最后的非0位

23阶乘最后的非0位 作者:XXX时间限制:1S章节:循环 问题描述 : N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。 ...

HurryBen的博客 450
上一篇: 中序表达式转换成后序表达式问题(栈的应用)
下一篇: (阶乘末尾0的个数的求法)求1~N中因子的数量的方法
oopos
博客等级 码龄19年 21粉丝 50原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值