第四章 函数和递归入门
1.数学库函数
ceil(x) x取整为不小于x的最小整数 ceil(-9.8)=-9.0,ceil(5.3)=6
floor(x) x取整为不大于x的最大整数 floor(-9.8)=-10.0,floor(5.3)=5
exp(x) 指数函数e^x
fabs(x) x的绝对值
fmod(x,y) x/y的浮点数余数
log(x) x(底数为e)的自然对数
log10(x) x(底数为10)的对数
pow(x,y) x的y次幂(x^y)
2.随机数生成
rand()%6,随机生成0-5的数,要是想要1-6的,直接rand()%6+1
srand(seed). Srand函数无返回值,他只会影响rand函数生成,是rand函数的种子
可让计算机通过读取自己的始终来获得种子值
srand(time(0)) time函数返回的是1970年1月1日0时到现在的秒数
3.递归
N阶乘
<span style="font-size:14px;">int factorial(int n)
{
if(n<=1)
return 1;
else
return n*factorial(n-1);
}
void main()
{
int num;
cin>>num;
cout<<factorial(num);
}
</span>
4.枚举类型enum
enum week {mon,tue,wed,thu,fri,sat,sun};//每一个对应一个值为0,1,2……
week wk=mon;//要初始化!!
int n;
cin>>n;
switch(n)
{
case 1:
wk=mon;
break;
case 2:
wk=tue;
break;
default:
break;
}
cout<<wk;//只能输出0,1,2……
但直接这样不行:转换为枚举类型要求显式转换(static_cast、C 样式转换或函数样式转换)
case 1:
wk=1;
break;
case 2:
wk=2;
break;
这样可以:
case 1:
wk=static_cast<week>(1);
break;
case 2:
wk=static_cast<week>(2);
break;
5.其他
c++中程序组件称为函数和类
cout<<fixed<<setprcision(1); 固定后面都是保留一位小数
inline 内联函数减少函数调用的开销-让编译器在适当的地方生成代码的副本以避免函数调用。-常搭配const
inline double cube(const double side)
{
return side*side;
}
调用即cout<<cube(3);
6. /*1. 编写一个函数,求两个整数的最小值。
(提示:函数原型为 int Min(int first, int second);)
利用编写好的函数,求给定三个数的最小值,给定四个数的最小值。
*/
<span style="font-size:14px;">int Min(int f,int s)
{
return f<s?f:s;
}
int Min1(int f,int s,int t)
{
return f<Min(s,t)?f:Min(s,t);
}
void main()
{
int a,b,c;
cin>>a>>b>>c;
cout<<Min1(a,b,c);
}
</span>
<span style="font-size:14px;">#include <iostream>
using namespace std;
/*4. 利用编号的素数判定函数(bool Prime(int n)), 验证哥德巴赫猜想。任意给定一个1000以内,大于2的偶数,
它能表示成两个质数之和。
*/
//判断是否是素数
bool Prime(int n)
{
if(n<=1)
return false;
for(int i=2;i<n;i++)
{
if(n%i==0)
{
return false;
break;
}
else
return true;
}
}
void main()
{
int n;
cin>>n;
if((n<=1000&&n>2)&&n%2==0)
{
for(int i=2;i<=n;i++)
{
if(Prime(i)&&Prime(n-i))//Prime()返回的是bool值,不能相加!
{
cout<<"="<<i<<"+"<<n-i<<endl;
break;
}
}
}
}
</span>
7.编写函数并测试。给定一个整数,求它的因子(包含1,但不包含自己。)的和(如整数6,因子为1,2,3,和为6)。
函数里面也能写cout!
<span style="font-size:14px;">void yinzi(int n)
{
int j=0;
for(int i=1;i<n;i++)
{
if(n%i==0)
{
j+=i;
cout<<i<<endl;
}
}
cout<<"因子和:"<<j;
}
void main()
{
int n;
cin>>n;
yinzi(n);
}
</span>
/*采用从简单到复杂方法实现。
a) 编写函数。求给定整数n的位数[intNumber(int n)]
b) 编写函数。求给定整数n的第m位的数字[intBit(int n, int m);]
c) 编写函数。将整数n的第m位的数字换成k,并且返回新的整数[intWriteBit(int n, int m, int k);]
d) 数字反向。参考以下伪码
bits = Number(n);
for(i=1; i<= bits; i++)
{
k = Bit(n, i);
m = WriteBit(m, bits+1-i, k)
}
*/
<span style="font-size:14px;">#include <iostream>
#include <cmath>
using namespace std;
//给定整数n的位数
int Number(int n)
{
int k=0;
for(int i=1;i<=n;i=i*10)//只要不超过他就加位数
{
k++;
}
return k;
}
//求给定整数n的第m位的数字[int Bit(int n, int m);]
int Bit(int n,int m)
{
int k;
//pow函数为float或double,则需转化为int,且10->10.0
k=n%(int)pow(10.0,m);
k=k/(int)pow(10.0,m-1);
return k;
}
//将整数n的第m位的数字换成k,并且返回新的整数[int WriteBit(int n, int m, int k);]
int WriteBit(int n,int m,int k)
{
n=n-(int)pow(10.0,m-1)*Bit(n,m)+(int)pow(10.0,m-1)*k;
return n;
}
void main()
{
int n;
cin>>n;
cout<<Number(n)<<"位数"<<endl;
int m;
cin>>m;
cout<<"第"<<m<<"位是"<<Bit(n,m)<<endl;
int k;
cin>>k;
cout<<"换成"<<k<<"后"<<WriteBit(n,m,k)<<endl;
n=WriteBit(n,m,k);
int bits=Number(n);
int dw=0,hw=0;
for(int i=1;i<=bits;i++)
{
dw=Bit(n,i);
hw=WriteBit(hw,bits-i+1,dw);//注意是对hw进行改写!
}
cout<<"数字反向"<<hw<<endl;
}
</span>
<span style="font-size:14px;">//求整数x,y的最大公约数
#include <iostream>
using namespace std;
int Gongyueshu(int x,int y)
{
if(y==0)
return x;
else
return Gongyueshu(y,x%y);
}
void main()
{
int x,y;
cout<<"输入x,y,x>=y"<<endl;
cin>>x>>y;
cout<<"最大公约数"<<Gongyueshu(x,y);
}
</span>