例题4-1 输入非负整数n和m,输出组合数,其中m<=n<=20
2014-07-28 19:02
288 查看
分析:按照书上说明,直接求20!会溢出。可以先将n!与m!和(n-m)!的较大者进行约分。在尝试一种简单的策略:看分子中的每一个数是否被分母可约。
代码:
结果:
代码:
#include <stdio.h> #define MAXN 20 int main(){ int a[MAXN],b[MAXN],resA=1,resB=1; int m,n,s,i,j,k,l,tmp; while((scanf("%d%d",&n,&m))!=EOF){ resA=resB=1; s=m>(n-m)?m:n-m; for(i=0;i+s<n;i++) a[i]=s+i+1; for(j=1;j<=n-s;j++) b[j]=j; for(k=1;k<j;k++){ tmp=b[k]; for(l=0;l<i;l++) if(!(a[l]%tmp)){ a[l]/=tmp; b[k]=1; break; } } for(l=0;l<i;l++) resA*=a[l]; for(k=1;k<j;k++) resB*=b[k]; printf("%d\n",resA/resB); } return 0; }
结果:
相关文章推荐
- 2-3.输入正整数n <= 20,输出一个n层的正三角形
- 4.输入正整数n <= 20,输出一个n层的正三角形。
- <仅是自己做笔记。。。系列-13>输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,
- 第九周实验任务二--定义Complex类中的<<和>>运算符的重载,实现输入和输出,使程序读起来更自然
- Cpp Primer<<学习IO标准库--输出缓冲区的管理、文件输入与输出_6
- 第九周试验任务1--定义Time类中的<<和>>运算符的重载,实现输入和输出。
- 重载输入>>,输出<<操作符
- C++输入n(n<100)个整数,找出其中最大的数,将它与最前面的数交换后输出这些数
- 第九周【项目1】在第8周项1的基础上(1)再定义一目运算符 -,-c相当于0-c(2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然
- 第一次仿照例题做出的:输入三个整数输出其中的最大数
- ACM457现在给出了一个只包含大小写字母的字符串,不含空格和换行,要求把其中的大写换成小写,小写换成大写,然后输出互换后的字符串。输入 第一行只有一个整数m(m<=10),表示测试数据组数。
- 【c语言】有一函数:x < 0 ,y = -1;x = 0,y = 0;x > 0,y = 1,编程输入一个x值,要求输出对应的y
- 某公司面试题:最长顺子;输入很多个整数(1<=数值<=13),返回其中可能组成的 最长的一个顺子(顺子中数的个数代表顺的长度); 其中数字1也可以当作14用
- 输入n(n<46)个学生的姓名和成绩,顺序输出这n个学生的姓名和成绩,并输出最高成绩的姓名和成绩。
- 有一函数当x<0时,y=1.x>0时,y=3.x=0时,y=5.编程,输入x,输出y.
- Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。 Input 输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。 Output 对于每组
- C++ FAQ Lite[15]--通过 <iostream> 和 <cstdio>输入/输出(新)
- 输入一个整数,如果该整数x符合条件:-1<x<10,则输出“ok”,否则输出“not ok”
- C++中输入输出<< 和>>重载,以便适应输出输入一个对象