C++难题,左思右想想不出来 函数与程序结构

来源:百度知道 编辑:UC知道 时间:2024/05/10 23:29:42
编写一个函数,求从n个不同的数中取r个数的所有选择的个数。其个数值为:
其中: n! = n * (n-1) * (n-2) * ... * 1。
1、基本要求:
主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0 0时,程序结束;
能检查输入数据的合法性,要求n>=1并且n>=r;
2、分别用递归和非递归两种方式完成程序设计;
3、多文件结构实现
将上面用非递归方式写成的程序改成用多文件结构表示。要求将main()函数放在一个文件中,将另外两个函数定义放在另一个C++源文件中,将两个函数原型申明放在一个C++头文件中。建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。
[测试数据]:
输入:5 3
输入:10 20
输入:-1 4
输入:50 3
输入:0 0
[实验提示]
1、利用一个非递归函数fn(int n)计算n!,利用另一个函数Cnr(int n, int r)计算Cnr,在该函数中调用fn(),
问题:你打算用什么样的变量类型来存放n!函数返回的值?注意各种数据类型的内存字长不同,整数能存放的数据范围有限,你如何解决?
可以用double数据类型来存放函数的计算结果
2、利用一个递归函数实现,利用公式实现递归:
C(n,r) = C(n, r-1) * (n – r + 1) / r
注意递归结束条件:
如果 r = 0 ,则C(n, r) = 1
如果 r = 1, 则C(n, r) = n
3、文件实现步骤:
新建一个项目,命名为“multifile”
用File|New创建一个新的”C++ Source File”,命名为main.cpp
用File|New创建一个新的”C++ Source File”,命名为func.cpp
用File|New创建一个新的”C/C++ Header File”,命名为func.h
用File|Open打开你前面实验中用非递归方式求C(n,r)的C++源程

#include<iostream.h>
double fn(int n);
void Cnr(int n, int r);
#include"fun.h"
double fn(int n)
{
int i;
double k=1;
for(i=n;i>=2;i--)
k*=i;
return k;
}
void Cnr(int n, int r)
{
cout<<"the result is:"<<fn(n)/(fn(r)*fn(n-r))<<endl;//这种更简单

}
#include"func.h"
void main()
{
int n,r;
while(1)
{
cout<<"intput n and r(0 0 to out):"<<endl;
cin>>n>>r;
if(n<r||n<0||r<0)
cout<<"input error!"<<endl;
else if(n==0&&r==0)
goto A;
else
Cnr(n,r);
};
A: cout<<"you chose to out!"<<endl;
}