zoukankan      html  css  js  c++  java
  • #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)

    实际题目

    本题要求实现一个打印非负整数阶乘的函数。

    函数接口定义:

    void Print_Factorial ( const int N );
    

    其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

    裁判测试程序样例:

    #include <stdio.h>
    
    void Print_Factorial ( const int N );
    
    int main()
    {
        int N;
    	
        scanf("%d", &N);
        Print_Factorial(N);
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例:

    15
    

    输出样例:

    1307674368000

    通过代码

     1 void Print_Factorial ( const int N ){
     2     int a[3000];  
     3     int n=N;
     4     if(n<0||n>1000){
     5         printf("Invalid input");
     6         return 0;
     7     }
     8     if(n==0){
     9         printf("1");
    10         return 0;
    11     }
    12     else{
    13          int w=0;  
    14     int i=0, j=0;  
    15     int t=n;  
    16     int k=0;    // 表示数据的位数。  
    17   
    18     i=0, k=0;  
    19     while(t)  //把数字按位数传入数组 
    20     {  
    21         a[i++] = t%10;  
    22         t/=10;  
    23         k++;  
    24     }  
    25   
    26     for (j=n-1; j>1; j--)  //开始阶乘 
    27     {  
    28         w=0;    // 表示进位  
    29         for (i=0; i<k; i++)  
    30         {  
    31             t = a[i]*j+w;  //每个位数乘乘数因子+是否进位 
    32             a[i] = t%10;  
    33             w = t/10;  
    34         }  
    35   
    36         while(w)  //需要进位了 
    37         {  
    38             a[i++] = w%10;  
    39             w/=10;  
    40             k++;  
    41         }  
    42     } 
    43     int ttt=0;
    44     int ii=0;  
    45      
    46     for (ii=k-1; ii>=0; ii--)  
    47     {  
    48         printf("%d",a[ii]);  
    49     }  
    50 
    51 
    52 
    53 
    54 
    55 
    56 
    57 
    58 
    59 
    60 
    61 
    62 
    63 
    64     
    65     }
    66     return 0;
    67 
    68 }

    知识点分析

    求阶乘,数过大,使用了数组进行存储

    例子中1000阶乘大约2500位,所以使用数组a[3000]

    建立一个计算的函数

    int fanc(int n)
    {
    int w=0;
    int i=0, j=0;
    int t=n;
    int k=0; // 表示数据的位数。

    i=0, k=0;
    while(t) //把数字按位数传入数组
    {
    a[i++] = t%10;
    t/=10;
    k++;
    }

    for (j=n-1; j>1; j--) //开始阶乘
    {
    w=0; // 表示进位
    for (i=0; i<k; i++)
    {
    t = a[i]*j+w; //每个位数乘乘数因子+是否进位
    a[i] = t%10;
    w = t/10;
    }

    while(w) //需要进位了
    {
    a[i++] = w%10;
    w/=10;
    k++;
    }
    }
    return k;
    }

    建立一个打印的函数

    个位存在数组第一个位置,十位存在第二个,以此类推,

    所以输出的时候要反向输出。

    123是按照 3 2 1存储的

    void show(int k)
    {
    int i=0;
    printf("位数 %d 位 ",k);
    for (i=k-1; i>=0; i--)
    {
    printf("%d",a[i]);
    }
    }

    引用博客

    链接:

    大数运算_求1000的阶乘(C语言实现)

    引用代码

     1 // 1000 的阶乘 2568 位  
     2 #include <stdio.h>  
     3   
     4 int a[3000];  
     5   
     6 void show(int k)  
     7 {  
     8     int i=0;  
     9     printf("位数 %d 位
    ",k);  
    10     for (i=k-1; i>=0; i--)  
    11     {  
    12         printf("%d",a[i]);  
    13     }  
    14 }  
    15   
    16 int fanc(int n)  
    17 {  
    18     int w=0;  
    19     int i=0, j=0;  
    20     int t=n;  
    21     int k=0;    // 表示数据的位数。  
    22   
    23     i=0, k=0;  
    24     while(t)  
    25     {  
    26         a[i++] = t%10;  
    27         t/=10;  
    28         k++;  
    29     }  
    30   
    31     for (j=n-1; j>1; j--)  
    32     {  
    33         w=0;    // 表示进位  
    34         for (i=0; i<k; i++)  
    35         {  
    36             t = a[i]*j+w;  
    37             a[i] = t%10;  
    38             w = t/10;  
    39         }  
    40   
    41         while(w)  
    42         {  
    43             a[i++] = w%10;  
    44             w/=10;  
    45             k++;  
    46         }  
    47     }  
    48     return k;  
    49 }  
    50   
    51   
    52 int main()  
    53 {  
    54     int n;  
    55     int k=0;  
    56   
    57     scanf("%d",&n);  
    58     k = fanc(n);  
    59     show(k);  
    60     printf("
    ");  
    61     return 0;  
    62 }  
  • 相关阅读:
    去掉DevExpress gridControl控件表头上的的默认英文字母
    【555】folium 更换底图
    github图片不显示问题解决
    厉害了,自己动手实现 LRU 缓存机制!
    一文搞懂 Netty 的整体流程,还有谁不会?
    PageHelper 分页一直有性能问题?
    left join 后用 on 还是 where,区别大了!
    不推荐别的了,IDEA 自带的数据库工具就很牛逼!
    王炸!!IDEA 2021.1 推出语音、视频功能,边写代码边聊天,我真的服了…
    别再面向 for 循环编程了,Spring 自带的观察者模式就很香!
  • 原文地址:https://www.cnblogs.com/hx97/p/10789237.html
Copyright © 2011-2022 走看看