zoukankan      html  css  js  c++  java
  • 算法竞赛入门经典 程序4-1 组合数

    算法竞赛入门经典 程序4-1 组合数


    其中求一个数的阶乘多次出现,为了方便以及保证程序整洁,将其作为一个函数编写

    #include<iostream>
    using namespace std;
    long long factorial(int n)
    {
    	long long m=1;
    	for(int i=1;i<=n;i++)
    	{
    		m*=i;
    	}
    	return m;
    }
    long long c(int n,int m)
    {
    	return factorial(n)/(factorial(m)*factorial(n-m));
    }
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	long long res=c(n,m);
    	cout<<res;
    	return 0;
    } 
    


    编写程序结束后记得测试
    即使最终答案在所选择的数据类型范围之内,计算的中间结果仍然可能溢出。
    所以关键:避免中间结果溢出
    溢出的是阶乘的部分:即n! 所以进行约分 n!/m!=(m+1) (m+2)…(n-1)n

    #include<iostream>
    using namespace std;
    long long c(int n,int m)
    {
    	//把大的那两个数直接约掉
    	if(m<n-m) m=n-m;
    	long long ans=1;
    	for(int i=m+1;i<=n;i++)
    	{
    		ans*=i;
    	}
    	for(int i=1;i<=n-m;i++)
    	ans/=i;
    	return ans;	 
    }
    int main()
    {
    	int n,m;
    	cin>>n>>m;
    	long long res=c(n,m);
    	cout<<res<<endl; 
    	return 0;
    }
    

    对复杂的表达式进行化简有时不仅能减少计算量,还能减少甚至避免中间结果溢出。
    这或多或少需要一些数学知识,数论的有关内容

  • 相关阅读:
    ABP文档
    SqlServer英文单词全字匹配
    npm不是以管理身份运行遇到的问题
    concurrenthashmap jdk1.8
    HashSet源码分析 jdk1.6
    Iterator设计模式--jdk1.7
    代理模式
    高并发下的HashMap,ConcurrentHashMap
    HashMap源码分析jdk1.6
    Stack&Vector源码分析 jdk1.6
  • 原文地址:https://www.cnblogs.com/serendipity-my/p/12635629.html
Copyright © 2011-2022 走看看