在字符串c ++中乘以数字

时间:2013-01-27 17:33:25

标签: c++ visual-c++ bignum

我正在寻找的是在字符串

中对数字使用简单数学

我正在尝试找到100的阶乘,将它放在int或long很长时间,所以我搜索并发现字符串是最好的解决方案但是

我不能将字符串中的数字相乘或者甚至将int放入乘法然后将其放回字符串中我不能使用不是来自c ++标准的库而且可以帮助我

2 个答案:

答案 0 :(得分:2)

要解决此问题,您必须编写一些代码,将一个数字与另一个数字相乘。 这是一个将字符串内容乘以2的函数:

void times_two(char *str)
{
    int carry = 0;
    for(int i = DIGITS-2; i >= 0; i--)
    {
    int t = str[i] - '0';
    t *= 2;
    t += carry;
    str[i] = (t % 10) + '0';
    carry = (t > 9);
    }
}

它假设该字符串为DIGITS字符长,并在字符串右侧“调整”为零,以填充它。

当然,如果你试图乘以“超过一个数字”,你将不得不循环你所乘的数字的长度,你还必须关心“携带”不止一个两个以上的任何东西。但原则是一样的。

[我故意不重写我上面的功能来应对这两种情况,因为你做100的阶乘的目的不是找到答案,而是学习如何解决编程问题。如果您只想找到答案,那么您可以使用现代计算器!]

答案 1 :(得分:1)

这是我曾经在O(n^2)时间内编写的代码。有更好的算法,比如在O(nlog n)时间内运行的快速傅立叶变换矩阵(fft)。 乘法函数接受2个字符串(数字)并返回其产品。

#define itc(n) char(n+48)
#define cti(ch) (ch-48)
 string itos(lld n)
    {
        ostringstream convert;
        convert<<n;
        return convert.str();
    }   



string add(string s1, string s2)
{
    int len1=s1.length(), len2=s2.length();
    if(len1<len2)                                   //s1 should be of greater length than s2
        return add(s2, s1);
    string ans="";
    int carry=0, i, s;
    for(i=1;i<=len1;i++)
    {
        s = carry+cti(s1[len1-i]);

        if(i<=len2)
            s += cti(s2[len2-i]);

        ans = itc(s%10)+ans;                        //finding the character to be added to the ans
        carry = s/10;                               //finding the carry
    }
    if(carry!=0)
        ans = itc(carry)+ans;

    return ans;
}

     string multiply(string s1, string s2)
        {
            int len1=s1.length(), len2=s2.length();
            if(len1<len2)
                return multiply(s2,s1);
            int i,j,p, carry=0;
            string result, net="", c;
            for(i=len2-1;i>=0;i--)
            {
                carry=0;
                result="";
                c="";
                for(j=len1-1;j>=0;j--)
                {
                    p=cti(s1[j])*cti(s2[i]);
                    result = itc((p+carry)%10)+result;
                    carry=(p+carry)/10;
                }
                if(carry!=0)
                {
                    c=itos(carry);
                    result=c+result;

                }
                for(j=i;j<len2-1;j++)
                    result+="0";

                net=add(net,result);
            }
            return net;
        }