阶乘计算(高精度乘法 使用vector)

#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;
}

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值