#include<iostream>
#include<vector>
using namespace std;
//乘法进位处理函数
void mul(vector<int>&r, int num){//新函数取容器的引用,对容器进行原地操作。不要忘记对变量的定义
int c=0;//c用来存储进位的值
for(int i=0;i<r.size();i++){//这个循环用来对容器中的每一位都乘以下一个数,保存c中的进位值加到下一位中
int p=r[i]*num+c;
r[i]=p%10;//取p的零
c=p/10; //取整,也就是取进位
}
while(c){//此处运用while循环,将多余的进位加到容器末尾
r.push_back(c%10);//push_back函数将括号中的数字添加到容器末尾
c/=10;//对c取整,如果c还存在就继续向后存
}
}
//用于实现阶乘的函数
void fac(int n){ //没有返回值,调用函数后直接输出
vector<int> r;
r.push_back(1);
for(int i=2;i<=n;i++){
mul(r,i);
}
for(int i=r.size()-1;i>=0;i--){//由于将高位都加到了容器的末尾,正常读取最终数的值需要倒叙输出这个函数
cout<<r[i];
}
}
int main(){
int n;
cin>>n;
fac(n);//调用阶乘函数
return 0;
}
#include <iostream>
#include <vector> //vector:用于使用动态数组功能。
using namespace std;
//高精度乘法处理函数
void multiply(vector<int>& result, int num) {//传来一个容器中的值,和需要乘的阶乘中的数 传递引用
int carry = 0;//定义一个int型的变量,用来存储进位
for (int i = 0; i < result.size(); ++i) {//对这个容器中的每一位乘以下一个数
int prod = result[i] * num + carry;//第二次循环加上上一次carry的取整值
result[i] = prod % 10;//取零
carry = prod / 10;//carry取整
}
while (carry) { //carry用来存储进位
result.push_back(carry % 10);
carry /= 10; //这里是循环结束后如果还有进位没有处理继续将它添加到容器末尾
}
}- 这个函数用于将存储在vector<int>中的大整数与一个整数num相乘。
- 它遍历vector中的每一位,与num相乘,并处理进位。
- carry用于存储进位,在每次循环中更新。
- 循环结束后,如果仍有未处理的进位,则继续将其加到vector的尾部。//计算阶乘函数
void (int n) { //主函数传来值n
vector<int> result; //定义了一个int型的vector result(动态数组容器,数组大小可动态改变,提供迭代器)
result.push_back(1); // 最后一个元素的值设置为1 pop_back:移除最后一个元素 result.insert(result.begin(), 1);//在开头添加元素
for (int i = 2; i <= n; ++i) {
multiply(result, i); // 乘以i,,,这里进入高精度处理函数
}
// 输出结果
for (int i = result.size() - 1; i >= 0; --i) {
cout << result[i]; //高位在后 倒叙输出这个容器中目前的所有值,就是正常的数字读取顺序
}
}- 这个函数计算给定数字`n`的阶乘。
- 初始化一个`vector<int>`,仅包含一个元素`1`,表示数字1。
- 通过从`2`循环到`n`,逐步使用`multiply`函数将结果与当前数字相乘,实现阶乘的累乘效果。
- 最后,反向遍历`vector`,从最高位到最低位打印出结果。
int main (){
int n;
cin>>n;
factorial(n);
return 0;
}