关闭

高精度计算-n的阶乘

标签: 高精度n的阶乘蓝桥算法
1717人阅读 评论(0) 收藏 举报
分类:
问题描述
  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n。
算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
输出格式
  输出n!的准确值。
样例输入
10
样例输出
3628800

n的阶乘是不难,但是关键在于n取值太大,数据会溢出,不能用数据类型存储,所以只能把数据存在字符数组里面,再对字符数组进行

乘法运算,本来想到java的大数类可以直接解决这问题,但是感觉那样没有意义。解决问题的时候碰到点小插曲,至今还没有明白为什么

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void calculate_mul(char *mul_1,char *mul_2,char *result)//两个字符数的乘法
{
    int i,j,k=0,off=-1,r=0;
    int temp0;
    for(i=strlen(mul_2)-1;i>=0;i--)
    {
        r=0;
        off++;
        k=0;
        for(j=strlen(mul_1)-1;j>=0;j--)
        {
           if(result[k+off]==0)
            {
                result[k+off]=((mul_1[j]-'0')*(mul_2[i]-'0')+r)%10+'0';
                r=((mul_1[j]-'0')*(mul_2[i]-'0')+r)/10;
            }
            else
            {
                 temp0=result[k+off]-'0';
                 result[k+off]=(result[k+off]-'0'+(mul_1[j]-'0')*(mul_2[i]-'0')+r)%10+'0';
                 r=(temp0+(mul_1[j]-'0')*(mul_2[i]-'0')+r)/10;
            }
            k++;
        }
        if(r!=0)
        {
            result[k+off]='0'+r;
        }
    }
    strrev(result);
}
void nn(char *str_nn)
{
    int i,n;
    char r[3000]="1";
    char tmp[3000]="1";
    char tmp2[3000]="1";
    n=atoi(str_nn);
    for(i=1;i<=n;i++)
    {
        strcpy(tmp,r);
        strcpy(r,"0");
        strcpy(tmp2,"0");
        itoa(i,tmp2,10);
        calculate_mul(tmp,tmp2,r);
    }
    printf("%s\n",r);
}
int main()
{
    char str_n[10]={0};
    scanf("%s",&str_n);
    nn(str_n);
    return 0;
}

n<=7的时候都正确,但是n=8的时候,却出乎意料的输出了40720,8!=7!*8=5040*8=40320,调试半天还是没有调试看出问题所在。

第二天各种尝试改成下面,竟然成功了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void calculate_mul(char *mul_1,char *mul_2,char *result)//两个字符数的乘法
{
    int i,j,k=0,off=-1,r=0;
    int temp0;
    for(i=strlen(mul_2)-1;i>=0;i--)
    {
        r=0;
        off++;
        k=0;
        for(j=strlen(mul_1)-1;j>=0;j--)
        {
           if(result[k+off]==0)
            {
                result[k+off]=((mul_1[j]-'0')*(mul_2[i]-'0')+r)%10+'0';
                r=((mul_1[j]-'0')*(mul_2[i]-'0')+r)/10;
            }
            else
            {
                 temp0=result[k+off]-'0';
                 result[k+off]=(result[k+off]-'0'+(mul_1[j]-'0')*(mul_2[i]-'0')+r)%10+'0';
                 r=(temp0+(mul_1[j]-'0')*(mul_2[i]-'0')+r)/10;
            }
            k++;
        }
        if(r!=0)
        {
            result[k+off]='0'+r;
        }
    }
    strrev(result);
}
void nn(char *str_nn)
{
    int i,n;
    char r[3000]="1";
    char tmp[3000]="1";
    char tmp2[3000]="1";
    n=atoi(str_nn);
    for(i=1;i<=n;i++)
    {
         memset(tmp,0,sizeof(tmp));
        strcpy(tmp,r);
        memset(r,0,sizeof(r));
        memset(tmp2,0,sizeof(tmp2));
        itoa(i,tmp2,10);
        calculate_mul(tmp,tmp2,r);
    }
    printf("%s\n",r);
}
int main()
{
    char str_n[10]={0};
    scanf("%s",&str_n);
    nn(str_n);
    return 0;
}









1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

算法篇-高精度-阶乘的精确值

题目:输入不超过1000的正整数n,输出n!=1x2x3···xn的精确结果。 样例输入:30 样例输出:265252859812191058636308480000000   代码如下: ...
  • Liuchang54
  • Liuchang54
  • 2015-04-03 20:43
  • 1666

用高精度方法计算n! ,并显示n!(阶乘)的值。

【问题描述】  对于任意给定的n值(n为整数,且1 【样例】 输入:n= 10 输出: 3628800 又输入:n= 20 输出: 2432902008176640000 使用整型数组...
  • Hackbuteer1
  • Hackbuteer1
  • 2011-08-22 15:51
  • 8359

C语言高精度计算N的阶乘代码

  • 2012-04-05 00:35
  • 3KB
  • 下载

(C语言)高精度阶乘

题目描述 启明星软件组组长听说我们会乘法之后,立马让我们帮他算一下阶乘(怎么有这么坏的组长)。 此题也很简单只需要算一下不大于100的数n的阶乘就好了,看我多好数据一下子少了10倍哦! ...
  • YiMo_Fan
  • YiMo_Fan
  • 2017-04-22 21:43
  • 406

阶乘计算升级版

本题要求实现一个打印非负整数阶乘的函数。 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000。如果N是非负整数...
  • sunhero2010
  • sunhero2010
  • 2015-10-19 21:53
  • 1604

来往这里看!高精度处理阶乘和~

用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入正整数N,输出计算结果S。 这篇文章是用高精度来处理的,大家...
  • qq_37555704
  • qq_37555704
  • 2017-02-27 13:30
  • 522

蓝桥杯(vip试题) 基础练习 阶乘计算

基础练习 阶乘计算   时间限制:1.0s   内存限制:512.0MB        问题描述   输入一个正整数n,输出n!的值。   其中n!=1*2*3*…*...
  • cl_cjh
  • cl_cjh
  • 2016-12-13 00:29
  • 848

阶乘计算(高精度)

基础练习 阶乘计算   时间限制:1.0s   内存限制:512.0MB        问题描述   输入一个正整数n,输出n!的值。   其中n!=1*2*3*…*...
  • a237653639
  • a237653639
  • 2014-03-16 13:20
  • 713

N!(高精度计算)

实验任务 给出一个数 N,请你计算 N!的值。 数据输入 每个例子第一行只有一个数 N(1<=N<=1000)。 数据输出 对于每个 N,在一行里输出 N!的值。 输入示例 1 ...
  • xmzyt1996
  • xmzyt1996
  • 2015-03-15 15:17
  • 217

蓝桥杯基础练习 阶乘计算(高精度方法)

基础练习 阶乘计算   问题描述   输入一个正整数n,输出n!的值。   其中n!=1*2*3*…*n。 算法描述   n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方...
  • wzt529
  • wzt529
  • 2016-12-08 17:16
  • 436
    个人资料
    • 访问:168352次
    • 积分:3643
    • 等级:
    • 排名:第10367名
    • 原创:195篇
    • 转载:58篇
    • 译文:0篇
    • 评论:23条