编写1到100的阶乘和怎么写?

如题所述

#include <iostream>
#include <string>
using namespace std;
//以下是加法
//让位数相同的函数
void size(string& s1, string& s2) //在头位置加0,达到相同位数
{
string s3;
int n = 0;
int i = 0;
if (s1.size() > s2.size())
{
n = s1.size() - s2.size();
while (n)
{
s3.insert(i++, "0");
--n;
}
s3.append(s2); //拼接成员函数
s2.assign(s3); //赋值成员函数
}
else
{
n = s2.size() - s1.size();
while (n)
{
s3.insert(i++, "0");
--n;
}
s3.append(s1); //拼接成员函数
s1.assign(s3); //赋值成员函数
}
}
//大数加法
string plus1(string s1, string s2) //加法
{
if (s1.size() != s2.size()) //判断是否位数相同
{
size(s1, s2);
}
int i = 0; //标记
string sta, stb;
for (i = s1.size() - 1; i >= 0; i--) //将s1倒插入到sta对象中
sta.push_back(s1[i]);
for (i = s2.size() - 1; i >= 0; i--) //将s2倒插入到stb对象中
stb.push_back(s2[i]);
string stc; //stc用来存放计算结果
int temp1 = 0; //标记1,用来计算相加结果
int temp2 = 0; //标记2,用来存放进位结果
for (temp2 = 0, i = 0; i <= sta.size(); i++)
{
if ((sta[i]) + (stb[i]) > 57) //当值小于57表示,没有相加的数
temp1 = (sta[i]) + (stb[i]) - 96 + temp2; //-96表示ASCII中字符与数字转换(48 = 字符0)
else
temp1 = temp2;
stc.push_back((temp1 % 10) + 48); //倒插入到stc中,+48表示从数字转换为字符
temp2 = temp1 / 10; //计算 进多少位数
}
return stc;
}
//以下是阶乘所用函数
//进位函数
void push(string& s1, int& temp1) //进位函数
{
int temp2;
while (temp1) //这个循环表示如果进10位就添加2位,进100位添加3位,以此类推(如果进13位,就把3和1插入,如进456位就把6,5,4顺序插入)
{
temp2 = temp1 % 10 + 48; //+48表示转换为字符
temp1 /= 10;
s1.push_back(temp2);
}
}
//计算阶乘
string factorial(int n) //计算阶乘
{
string s1 = "1"; //阶乘是从1开始计算
int i = 0; //标记1
int j = 0; //标记2
int temp1 = 0; //标记3,用来计算相加结果
int temp2 = 0; //标记4,用来存放进位结果
for (i = 2; i <= n; i++)
{
temp1 = 0;
for(j = 0; j < s1.size(); j++)
{
temp2 = ((s1[j]) - 48) * i + temp1; //存储的是ASCII表示数字(ASCII范围是48-57)。-48表示转换为可用于计算数字,
s1[j] = temp2 % 10 + 48; //%10可求到进位后的个位。+48表示转换为ASCII字符在存储进去
temp1 = temp2 / 10; //计算 进多少位数,/10可求要进多少10。(10进1位)
}
if (temp1 < 10 && temp1 > 0) //当进位小于10不必调用push函数
{
s1.push_back(temp1 + 48); //+48表示转换为ASCII字符
}
else
push(s1, temp1);

}
return s1;
}
//输出结果函数
void output(string a) //输出,因为是倒序存储所以要倒序输出
{
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] == '0' && i == a.size() - 1) //输出去除开头的0
continue;
cout << a[i];
}
cout << endl;
}
//反向存储
string inversion(string a) //倒序存储
{
string st;
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] == '0' && i == a.size() - 1) //输出去除开头的0
continue;
st.push_back(a[i]);
}
return st;
}
//计算总和函数
void sum(string& a, string b)
{
a.assign(inversion(a));
b.assign(inversion(b));
a.assign(plus1(a, b));
}

int main()
{
string st1;
int n = 0;
cout << "输入n的值:";
cin >> n;
for (int i = 1; i <= n; i++)
{
sum(st1, factorial(i));
}
cout << "1到" << n << "阶乘的和是:" << endl;
output(st1);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-06-25
这个必须要利用高精度计算。需要编写一个高精度乘法的函数和一个高精度加法的函数。本回答被网友采纳
相似回答