1130 判断素数
- 思路:素数就是没有除了1与本身之外的因数。我举个判断12的例子说明一下循环的边界为什么如我的代码那般。
因数 | 对应因数 |
2 | 6 |
3 | 4 |
4 | 3 |
6 | 2 |
所以,只需要判断一半,也就是到sqrt(n)为止就可以了。
代码:
bool is_prime(int n){
bool tag=true;
for(int i=2;i*i<=n;i++){
if(0 == n%i){
tag=false;
break;
}
}
return tag;
}
2644 求最大公约数
- 思路:可能很多小朋友可以直接用循环的简单思路做出来,我这里给一份递归代码,你们可以自行体会一下,感兴趣的可以上CSDN搜一下。
- 代码:
int gcd(int x, int y){
return y?gcd(y,x%y):x;
}
2645 不一样的斐波那契
- 代码:
void Fibo(int m){
int lst=1,crt=1,cnt=2;
while(lst<=m){
int temp=lst;
lst+=crt;
crt=temp;
cnt++;
}
printf("Value=%d,Location=%d\n",lst,cnt);
}
1143 汉诺塔
- 思路:这个题对于刚学函数的你们来讲可能有点难,因为这是一个经典递归题目,是函数自己调用自己的。不过如果能想清楚步骤,代码也很简单的。一个递归函数首先要有一个出口,你要判断什么时候结束递归。在这里就是只有一个碟子也就是最上面的碟子需要移动的时候,终止递归。
- 递归过程:要想把一个碟子移到另一个柱子上首先要把它上面的碟子移到闲置的柱子上去,然后再把它移过去。最后你还需要把原先它上面的碟子移到现在的它上面去,才能完成整个一堆的移动,一堆的移动规则与两个的移动规则一样,所以一层一层按这样的过程来办就好了。
- 代码:
void hanoi(int n,char src,char spr,char dest){
if(n==1){//出口
printf("%c->%c\n",src,dest);
}
else{
hanoi(n-1,src,dest,spr);
printf("%c->%c\n",src,dest);
hanoi(n-1,spr,src,dest);
}
}
小结:
其实这次主要就一个问题吧,就是一些小可爱们对于函数整个都不了解。我觉得你们最应该做的就是看看书。看到一只小可爱没有写函数的返回类型。虽然函数返回类型默认为int,但我认为还是规范一些写上去更好。
下面我稍微再说一下函数吧。举汉诺塔的例子,如果我一开始在main函数前面写了一个void hanoi(int n, char src, char spr, char dest);这样的东西,这个叫做函数的声明。具体的函数实现可以放在main函数之后。当然按你们的写法直接写也可以,并且这里题目要求就是直接写。函数名之前的是返回类型。红色的是形参,是调用函数的时候生成的一些变量,而函数调用的时候比如写到hanoi(n,a,b,c);这里面蓝色的是实参,实参的值会被传给函数,分别赋给对应的形参,但是形参的值不会对实参产生影响。在hanoi函数内部,我们可以利用传进去的这些值做一些操作,还可以处理传进去的数据获得一个你想返回的值,把它return给函数。你们的main函数里hanoi(n,a,b,c)这么个东西就是调用了上面的函数之后返回的值,你可以直接用它做判断,也可以把这个值赋给你想赋给的变量。
另外递归的话,就是函数自己调用自己。既可以直接调用自己,也可以先调用另几个函数,在另外的函数内又间接调用了自己。写递归代码的时候一定要注意看会不会发生死循环,看看你的函数是否有一个出口。