#include
#include
#include
#include
#include
#include
#include
#include
class Integer
{
public:
Integer()
{
}
Integer(unsigned int value)
{
SetValue(value);
}
~Integer()
{
Clear();
}
void SetValue(unsigned int value)
{
Clear();
unsigned int v;
while (value > 0)
{
v = value % 10000;
m_vecNodes.push_back(v);
value /= 10000;
}
}
void Clear()
{
m_vecNodes.clear();
}
void Multiply(unsigned int v)
{
size_t count = m_vecNodes.size();
for (size_t i = 0; i < count; i++)
{
if (m_vecNodes[i])
{
m_vecNodes[i] *= v;
}
}
for (size_t i = 0; i < count; i++)
{
if (m_vecNodes[i] > 10000)
{
unsigned int k = m_vecNodes[i] / 10000;
m_vecNodes[i] %= 10000;
if (i < count - 1)
{
m_vecNodes[i + 1] += k;
}
else
{
while (k > 0)
{
unsigned int vv = k % 10000;
m_vecNodes.push_back(vv);
k /= 10000;
}
}
}
}
}
void Print() const
{
size_t count = m_vecNodes.size();
if (count == 0)
{
return;
}
if (m_vecNodes[count - 1] > 999)
{
printf("%d ", m_vecNodes[count - 1]);
}
else if (m_vecNodes[count - 1] > 99)
{
printf(" %d ", m_vecNodes[count - 1]);
}
else if (m_vecNodes[count - 1] > 9)
{
printf(" %d ", m_vecNodes[count - 1]);
}
else
{
printf(" %d ", m_vecNodes[count - 1]);
}
for (int i = (int)(count - 2); i >= 0; i--)
{
if (m_vecNodes[i] > 999)
{
printf("%d ", m_vecNodes[i]);
}
else if (m_vecNodes[i] > 99)
{
printf("0%d ", m_vecNodes[i]);
}
else if (m_vecNodes[i] > 9)
{
printf("00%d ", m_vecNodes[i]);
}
else
{
printf("000%d ", m_vecNodes[i]);
}
if (i % 10 == 0)
{
printf("\r\n");
}
}
}
bool SaveToFile(const char* szFileName) const
{
size_t count = m_vecNodes.size();
if (count == 0)
{
return false;
}
FILE * fp = ::fopen(szFileName, "wb");
if (!fp)
{
return false;
}
if (m_vecNodes[count - 1] > 999)
{
fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 4);
fprintf(fp, "%d ", m_vecNodes[count - 1]);
}
else if (m_vecNodes[count - 1] > 99)
{
fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 3);
fprintf(fp, " %d ", m_vecNodes[count - 1]);
}
else if (m_vecNodes[count - 1] > 9)
{
fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 2);
fprintf(fp, " %d ", m_vecNodes[count - 1]);
}
else
{
fprintf(fp, "位数: %d \r\n", (count - 1)*4 + 1);
fprintf(fp, " %d ", m_vecNodes[count - 1]);
}
unsigned int itor = 1;
for (int i = (int)(count - 2); i >= 0; i--)
{
if (m_vecNodes[i] > 999)
{
fprintf(fp, "%d ", m_vecNodes[i]);
}
else if (m_vecNodes[i] > 99)
{
fprintf(fp, "0%d ", m_vecNodes[i]);
}
else if (m_vecNodes[i] > 9)
{
fprintf(fp, "00%d ", m_vecNodes[i]);
}
else
{
fprintf(fp, "000%d ", m_vecNodes[i]);
}
if ((++itor) % 10 == 0)
{
fprintf(fp, "\r\n");
}
}
::fclose(fp);
ShellExecuteA(NULL, "open", szFileName, NULL, NULL, SW_SHOWNORMAL);
return true;
}
std::vector m_vecNodes;
};
void main()
{
Integer aaaa;
aaaa.m_vecNodes.resize(65536*256);
aaaa.SetValue(31);
for (unsigned int i = 30; i > 1; i--)
{
aaaa.Multiply(i);
}
aaaa.SaveToFile("c:\\31.txt");
aaaa.SetValue(99999);
for (unsigned int i = 99998; i > 1; i--)
{
aaaa.Multiply(i);
if (i % 50 == 0)
{
printf("%d \r\n", i);
}
}
aaaa.SaveToFile("c:\\99999.txt");
}