当前位置: 首页 > 知识库问答 >
问题:

c中带字符串的大数的阶乘

武元白
2023-03-14

我正在做一个带字符串的阶乘程序,因为我需要大于250的数字的阶乘

我打算:

string factorial(int n){
    string fact="1";
    for(int i=2; i<=n; i++){
        b=atoi(fact)*n;

    }

}

但问题是atoi不起作用。如何将字符串转换为整数。

最重要的是,我想知道这样的程序是否可以处理400的阶乘?

共有3个答案

黄弘盛
2023-03-14

下面的代码使用无符号双长来计算非常大的数字。

#include<iostream.h>


int main()
{
    long k=1;
    while(k!=0)
    {
        cout<<"\nLarge Factorial Calculator\n\n";
        cout<<"Enter a number be calculated:";

        cin>>k;

        if (k<=33)
        {
            unsigned double long fact=1;
            fact=1;
            for(int b=k;b>=1;b--)
            {
                    fact=fact*b;
            }
            cout<<"\nThe factorial of "<<k<<" is "<<fact<<"\n";
        }


        else
        {
            int numArr[10000];
            int total,rem=0,count;       
            register int i;              
            //int i;
            for(i=0;i<10000;i++)
            numArr[i]=0;             

            numArr[10000]=1;  
            for(count=2;count<=k;count++)   
            {
            while(i>0)
            {
                total=numArr[i]*count+rem;  
                rem=0;
                if(total>9)
                {
                    numArr[i]=total%10;
                    rem=total/10;
                }
                else
                {
                    numArr[i]=total;    
                }
                i--;             
            }
                rem=0;
                total=0;
                i=10000;
            }
            cout<<"The factorial of "<<k<<" is \n\n";
            for(i=0;i<10000;i++)            
                {
                    if(numArr[i]!=0 || count==1)  
                    {
                    cout<<numArr[i];
                    count=1;
                }
            }
            cout<<endl;
        }

        cout<<"\n\n";
    }//while
return 0;

}

输出:

![Large Factorial Calculator

Enter a number be calculated:250
The factorial of 250 is

32328562609091077323208145520243684709948437176737806667479424271128237475551112
09488817915371028199450928507353189432926730931712808990822791030279071281921676
52724018926473321804118626100683292536513367893908956993571353017504051317876007
72479330654023390061648255522488194365725860573992226412548329822048491377217766
50641276858807153128978777672951913990844377478702589172973255150283241787320658
18848206247858265980884882554880000000000000000000000000000000000000000000000000
000000000000][1]
郜琦
2023-03-14

不确定为什么要使用字符串。不使用整数向量可能会节省一些空间?这是我的解决方案,使用整数向量存储阶乘并打印。与400或任何大数字一起使用效果很好!

//Factorial of a big number

#include<iostream>
#include<vector>
using namespace std;



int main(){
    int num;
    cout<<"Enter the number :";
    cin>>num;
    vector<int> res;
    res.push_back(1);
    int carry=0;
    for(int i=2;i<=num;i++){
        for(int j=0;j<res.size();j++){
            int tmp=res[j]*i;
            res[j]=(tmp+carry)%10 ;
            carry=(tmp+carry)/10;

        }
        while(carry!=0){
            res.push_back(carry%10);
            carry=carry/10;
        }

    }

    for(int i=res.size()-1;i>=0;i--) cout<<res[i];
    cout<<endl;





    return 0;
}

输入数字:400的阶乘:64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

郭单鹗
2023-03-14

有一个网站将为您计算阶乘:http://www.nitrxgen.net/factorialcalc.php.它报告:

结果是250的阶乘!长度为493位。结果还包含62个尾随零(占整数的12.58%)

3232856260909107732320814552024368470994843717673780666747942427112823747555111209488817915371028199450928507353189432926730931712808990822791030279071281921676527240189264733218041186261006832925365133678939089569935713530175040513178760077247933065402339006164825552248819436572586057399222641254832982204849137721776650641276858807153128978777672951913990844377478702589172973255150283241787320658188482062478582659808848825548800000000000000000000000000000000000000000000000000000000000000

许多使用双C的系统只能工作到1E 308左右;价值250!太大,无法存储这么多。

因此,您需要使用某种类型的多精度算术库,或者使用您自己设计的C字符串,或者使用其他广泛使用的多精度库(例如GNU GMP)。

 类似资料:
  • 每个包作为,操作码用于知道它是什么类型的包,例如操作码2是登录包。 所以登录包有一个操作码和两个字符串。例如,用户名最大长度为18,密码最大长度为12,因此登录数据包的大小必须为31。 但是当用户名小于18时会发生什么呢?如果我的密码是10,用户名是4,我的数据包大小将是15,根据系统检查将是非法的。 它在做什么?应该如何做?

  • 问题内容: 我可以在下面从C中调用不带参数的Go函数。通过编译并打印 main.go 文件1.c 现在,我想将字符串/字符数组从C传递给GoFunction。 根据cgo文档中的 “对Go的C引用”,这是可能的,因此我向GoFunction添加了一个字符串参数,并将char数组传递给GoFunction: main.go 文件1.c 当我收到此错误: 其他参考:( 信誉不足,无法发布3个链接)根据

  • 给定一串十六进制字符,我想从这些字符中创建一个字节数组。例如,给定字符串“1A2B3C”,我希望我的数组包含0x1A、0x2B、0x3C。 我有它使用下面的代码工作,但希望看到一个更有效的方式这样做。 (此时已检查字符串长度等)。

  • 如果你使用过python,你会发现字符串和int/float/double便捷的拼接方式;但如果你使用C++,可能你每次需要的时候搜索一下才能知道。本文提供两种简单的方式来完成这个功能。 std::to_string() 通过std::to_string()将数字类型转换成std::string类型,从而可以直接使用+完成字符串的拼接。 # include <iostream> int main

  • 我有一个输入表单,允许某人键入unicode字符。所以它可能是类似于“嘿,uF32A怎么了?如果我得到这个字符串,它将有一个子字符串“\uF32A”,我如何将其转换为字符“\uF32A”?

  • 我有一个随机地址字符串,如 我想将其拆分为具有两个条件的字符串数组: 该字符串数组的每个元素的长度小于或等于20 字符串数组的元素没有尴尬的结尾 例如,每20个字符拆分将产生: 但正确的输出是: 注意字符串数组中的每个元素是如何小于或等于20的。 以上是我对这段代码的输出: