由于真的想挑战一下,然后遇到了瓶颈,这次我,遇到了瓶颈,多次遇到不是数字的符号,于是进行了修改修改,多次修改。
惯例,先贴代码。
#include <iostream>
class decimal
{
private:
int count;
public:
int length;
int len;
int * del;
decimal();
int d_replace();
int d_ride(int d_multiplier);
int d_Power(int d_multiplier,int second);
int d_output();
int d_Factorial(int num);
};
decimal:: decimal()
{
count = 50;
length = count;
decimal::del = new int[length];
del[0] = 1;
len = 1;
}
int decimal :: d_replace()
{
int * _del;
length += count;
std::cout << length << std::endl;
_del = new int[length];
count *= 2;
for(int i = 0;i < len; i++)
{
_del[i] = del[i];
}
del = new int[length];
for(int i = 0;i < len; i++)
{
del[i] = _del[i];
}
return 0;
}
int decimal :: d_ride(int d_multiplier)
{
unsigned int i,transition = 0;
for(int j = 0; j < len ;j++)
{
del[j] *= d_multiplier;
}
//d_output();
for(int z = len-1;z >= 0; z--)
{
transition = del[z]/10;
//std::cout << transition << std::endl;
for(i = z;transition != 0; i++)
{
if(i >= length - 1)d_replace();
if(i >= len)
{
del[i] = 0;
len = i + 1;
}
if(i != z)
del[i] += transition;
transition = del[i]/10;
//std::cout << "123\t" << transition << "\t"<< (int)del[i] << "\t" << len << std::endl;
del[i] %= 10;
//std::cout << (int)del[i] << std::endl;
}
}
return 0;
}
int decimal :: d_Power(int d_multiplier,int second)
{
int transition = 0;
for(int i = 0;i < second; i++)
{
d_ride(d_multiplier);
}
return 0;
}
int decimal :: d_output()
{
char c = 0;
for(int i = len-1;i >=0 ; i--)
{
c = del[i] + 48;
putchar(c);
}
putchar('\n');
return 0;
}
int decimal :: d_Factorial(int num)
{
if(num < 0)
{
std::cout << "num error!" << std::endl;
return 0;
}
if(num == 1 || num == 0)
{
del[0] = 1;
return 0;
}
for(int i = num;i > 1; i--)
{
d_ride(i);
//d_output();
//std::cout << "123\t" << i << std::endl;
//getchar();
}
return 0;
}
int main(int, char**) {
decimal d;
//d.d_Power(2,30000);
d.d_Factorial(20000);
d.d_output();
return 0;
}
看我在里面printf断点了多少次,大概就知道我有多崩溃,数据量太大溢出,然后我用了另外的一种方法,来计算乘法。在时间和空间上我选择了要空间不要时间,然后时间复杂度刷刷刷就上升。
毕竟利用时间的话,连脑子都不用疼直接莽就行了。
写完,两个字,舒适。