大数开方,大数相乘

来源:互联网 发布:ubuntu下载vim 编辑:程序博客网 时间:2024/05/22 16:39

                   计算两个很大的数的开方后的乘积

#include <iostream>#include <string>using namespace std;//两个字符串相乘string strMultiply(string str1 , string str2){    string strResult = "";    int len1 = str1.length();    int len2 = str2.length();    int num[500] = {0};    int i = 0, j = 0;    for(i = 0; i < len1; i++)    {        for(j = 0; j < len2; j++)        {            num[len1-1 - i + len2-1 - j] += (str1[i] - '0')*(str2[j] - '0');        }    }    for(i = 0; i < len1 + len2; i++)    {        num[i+1] += num[i] / 10;        num[i] = num[i] % 10;    }    for(i = len1 + len2 - 1; i >= 0 ; i--)    {        if(0 != num[i]) break;    }    for(j = i; j >= 0; j--)    {        strResult += num[j] + '0';    }    return strResult;}//str1 * 10^pos后(即在str1后添上pos个0),与str2作比较int compare(string str1, string str2, int pos){    int len1 = str1.length();    int len2 = str2.length();    if(len2 > len1+pos) return 0;    if(len2 < len1+pos) return 1;    int i = 0;    for(i = 0; i < len2; i++)    {        if(str1[i]-'0' > str2[i]-'0') return 1;        if(str1[i]-'0' < str2[i]-'0') return 0;    }    return 0;}//对大数str开方取整string sqrtLarge(string str){    int len = str.length();    int i = 0;    int j = 0;    string strResult = "";    string str1 = "";    if(len&1)        len=len/2+1;    else        len=len/2;    for(i = 0; i < len; i++)    {        for(j = 0; j < 10; j++)//枚举当前位从0~9每一个数        {            str1 = strResult;            str1 += j + '0';            if(1 == compare(strMultiply(str1, str1) , str , 2*(len-i-1)) )//判断当前这个数的平方与str的大小            {                //由于str1后少了len/2-i-1个0,所以平方以后少了2*(len/2-i-1)个                strResult +=  j-1 + '0';                break;            }            if(9 == j) strResult += '9';        }    }    return strResult;}int main(){    string str1;    string str2;    string strResult;    cin>>str1>>str2;    cout<<strMultiply(sqrtLarge(str1) , sqrtLarge(str2))<<endl;    return 0;}


0 0
原创粉丝点击