文章目录
第五章 函数
m=(a>b)?a:b;
return (m>c)?m:c;
名词:
余数remainder
a=39,b=12;a%b=3;a=12,b=3;a%b=0;gcd=b->3
return和int一样,不是函数,后面没有参数,不用接()
int reminder=a%b;
while(reminder!=0){
reminder=a%b;//放在后面??放前面的话12,39->0
a=b;
b=reminder;//Attentino!!!
}
b=最后一次不为0的reminder,所以reminder的赋值(第一次在while外面)和判断(在while里面)都放在b的赋值语句后面
若reminder放在前面,则reminder=0了,还得再赋值给b
5.17gcd in recursion:
30%18=12;18%12=6;12%6=0;6✔
//调试一下这个函数
int gcd(int a,int b){
//a=(a>b)?a:b 炫技那个呢?
if(a>b){
int tmp=a;
a=b,b=tmp;
}
int reminder=a%b;
while(reminder!=0){
a=b;
b=reminder;//Attentino!!!
reminder=a%b;//放在后面??放前面的话12,39->0
}
return b;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rKjfLYC-1577775554502)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576058079827.png)]
数组可以省略长度,等号num[]{xxx,xxx,xxx};
求数组个数:数组长度/单个元素的长度sizeof(num)/sizeof(int)
C++小技巧:注释的时候/**然后回车[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LSgLxycl-1577775554505)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576058242527.png)]
void transfer(int m)
{
int k,n;
k = m%2;
m = m/2;
if(m == 0){
cout<<k;
return;
}
else{
transfer(m);
cout<<k;//此处k并不会马上输出,等最后一个transfer执行完才输出程序将相当于:cout<<k0;cout<<k1;cout<<k2;...cout<<k,先输出的在左边,因此排序就是k0 k1 ... k
//如果cout放在tansfer前面就反过来
//因为此处先得到的m%2是权重最低的,因此应该放在最右边,所以最后输出,cout<<k放在transfer前面
}
}
/**每求余1次,从右往左输出
但是输出是从左往右的,越往后的k,越早输出。逆序,所以应该是递归调用后cout,
分割器代码
void slicer(int n){
if(n/10==0){
cout<<n<<endl;
}
else{
cout<<n%10<<endl;//key!(n%10!=n/10)
slicer(n/10);//key!!(n/10!=n%10)
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfisecLf-1577775554506)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576113867704.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6jYmcZl-1577775554507)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576113905237.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuogeTFm-1577775554508)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576114385387.png)]
double HermRecur(double x,int n){
if(n=0){
cout<<"H0("<<x<<")=1"<<endl;
}
else if(n=1){
cout<<"H1("<<x<<")="<<2*x<<endl;
return 2*x;
}
else{
cout<<"H"<<n<<"("<<x<<")="<<(2*x*HermRecur(x,n-1)-2*(n-1)*HermRecur(x,n-2))<<endl;
return (2*x*HermRecur(x,n-1)-2*(n-1)*HermRecur(x,n-2));
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-towkybNA-1577775554511)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576114608236.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5k4z1RC2-1577775554515)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576114946126.png)]
if(n=1)即if(1)永真,所以每次n都是1
后来又犯了一次这个错误…在HermValue里面…
{}一起输入然后再将光标移到里面敲回车
//Hermite
double HermValue(double x,int n){
if(n==0){
return 1;
}
else if(n==1){
return 2*x;
}
else{
return (2*x*HermValue(x,n-1)-2*(n-1)*HermValue(x,n-2));
}
}/删否?
void HermRecur(double x,int n){
if(n==0){
cout<<"H0("<<x<<")=1"<<endl;
}
else if(n==1){
cout<<"H1("<<x<<")="<<2*x<<endl;
HermRecur(x,0);
}
else{
cout<<"H"<<n<<"("<<x<<")="<<HermValue(x,n)<<endl;
HermRecur(x,n-1);
}
}
void Herm(double x,int n){
double value0=1,value1=2*x,value;
cout<<"H0("<<x<<")=1"<<endl;
if(n>1){
cout<<"H1("<<x<<")="<<2*x<<endl;
for(int i=2;i<=n;i++){
value=2*x*value1-2*(i-1)*value0;
value0=value1;
value1=value;
cout<<"H"<<i<<"("<<x<<")="<<value<<endl;
}
}
}
gcd遇到12,12卡住:12,60也卡住(都是因为reminder=0)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dai80yZ4-1577775554520)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\1576116834175.png)]
int gcd(int m,int n){//in recursion
int tmp=(m>n)?m:n;
n=m+n-tmp;
m=tmp;
int reminder=m%n;
return (n%reminder==0)?reminder:gcd(n,reminder);//若reminder=0,出现错误12%0
}
//待修改
if(n>1){
cout<<"H"<<n<<"("<<x<<")="<<HermRecur(x,n)<<endl;//要用到HermRecur的值,所以不能是void
return (2*x*HermRecur(x,n-1)-2*(n-1)*HermRecur(x,n-2));
}//也可以利用有返回值的函数进行操作,别在意返回值就行了--for函数都有返回值哈~
else if(n=1){
cout<<"H"<<n<<"("<<x<<")"<<2*x<<endl;
cout<<"H0("<<x<<")="<<1<<endl;
return 2*x;
}
else{
return 1;
}
}
2&&3是true
2&&0是false
for(int i=2;i<=a/2;i++){//不能从i=1开始,否则都是非素数
cout<<"----i=\t"<<i<<endl;///
if(a%i==0){//非素数,返回0
return 0;
}
}
如果输入i=3,for不会循环->2>3/2