这道题的核心是,将小数点先删除进行存储,并且记录小数的位数,例如
“0.234”存储为“234“小数点位数3,然后进行”234“与”234“的多次相乘最后把小数点加上
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include <iomanip>
using namespace std;
typedef struct name
{
string s;
int point_num;
}name;
string multiply(string a, string b)//两个整型大数相乘
{
int la = a.size();
int lb = b.size();
int lm = la + lb;
string mul = "";
mul.insert(mul.begin(), lm, '0');//两数相乘的积的最大位数为两数的位数和
for (int i = la - 1; i >= 0; i--)
for (int j = lb - 1, k = i + j + 1; j >= 0; j--, k--)
{
int temp = (mul[k] - '0') + (a[i] - '0')*(b[j] - '0');
mul[k] = temp % 10 + '0';
mul[k - 1] = (mul[k - 1] - '0') + temp / 10 + '0';
}
int num = 0;
int k = 0;
while (mul[k] == '0')
{
mul.erase(mul.begin());
}
return mul;
}
name zhengli(string a)//统计小数点后有几位小数
{
int la;
string A="";
int point;
if (a[0] == '0')//字符串为0.234形式A为234,小数点位数point为3
{
A.insert(A.begin(),a.begin() + 2,a.end());
la = A.size();
point = A.size();
for (int i = la-1; i >=0; i--)
{
if (A[i] == '0')
{
A.erase(A.begin() + i);
point--;
}
else
break;
}
}
else//字符串为9.4543形式,A为94543,小数点位数point为4
{
la = a.size();
bool sign = false;
for (int i = 0; i < la; i++)
{
if (a[i] == '.')//判断字符串里有没有小数点
{
a.erase(a.begin() + i);
point = a.size() - i;
sign = true;
break;
}
}
if (sign)//有小数点
{
la = a.size();
for (int i = la - 1; i >= 0; i--)
{
if (a[i] == '0')//删除小数点末尾无效的0
{
a.erase(a.begin() + i);
point--;
}
else
break;
}
A = a;
}
else//没有小数点
{
A = a;
point = 0;
}
}
name result;//没有办法直接返回两个返回值,所以采用结构体形式
result.s = A;
result.point_num = point;
return result;
}
int main()
{
string a = "1.0100";
int n = 12;
zhengli(a);
name re = zhengli(a);
//cout << re.s << endl << re.point_num << endl;
string str = re.s;
int m = n - 1;
while (m--)
{
str = multiply(str, re.s);
}
if (str.size()>re.point_num*n)
str.insert(str.end() - re.point_num*n, '.');
else
{
int m=re.point_num*n - str.size();
while (m--)
str.insert(str.begin(), '0');
str.insert(str.begin(), '.');
str.insert(str.begin(), '0');
}
cout << str;
system("pause");
return 0;
}