- 主辅函数if的return调用((参照最新的刷题标准解决问题中遇到的技巧)
1)if(辅函数的return值)
如果能够返回一个非0的数,则 if 里条件为真执行主函数后续的语句。
如果返回0或压根没返回,则if里就为假。
#include<stdio.h>
int isPrime(int n);
int main()
{
int n; //给定整数大于一
scanf("%d",&n);
int i;
for(i=2;i<=n;i++){
if(isPrime(i)) // return没有返回 则定为0
printf("%d ",i);
}
return 0;
}
int isPrime(int n)
{ int flag=0;
for(int i=2;i<n/2;i++)
{
if(n%i==0)
{
flag=1;
break; //直接跳出循环 ,没有循环语句不能用break和continue,if只是条件分支
}
}
if(flag==0) return n;
}
- break增加效率和continue类似用法
以下是判断素数的改进版本,用了break后可以减少flag=1重复赋值
1)break和continue用法用课上的例子来说就是:一个直接跳出循环,一个结束此轮循环并进入下一轮
老师让学生唱歌,第一个学生唱的好,从头唱到尾了,即没有用break和contine
第二个学生唱的一般,唱到一半,让她别唱了,有请下一位同学,即用了contine
第三位学生唱的很难听,唱了一半,老师不敢再让人唱了,结束了唱歌的活动,即用了break
2)break和contine与循环(do-while,while,for)息息相关,但不要以为只跳出一个{ },他们的作用域是外层循环,再多括号( 如if{ } )并不影响
#include<stdio.h>
int main()
{
int n; //给定整数大于一
scanf("%d",&n);
int flag=0;
for(int i=2;i<n/2;i++)
{
if(n%i==0)
{
flag=1;
break;
}
}
switch(flag)
{
case 0:
printf("%d是素数呀",n);
break;
case 1:
printf("%d不是素数",n);
break;
}
return n;
}
- break高阶用法-接力
1)多层循环含有众多可能,如果只想筛选出自己想要的那一种,只需要在最内层循环加一个if,
随即利用break-exit 跳出外层循环(如果不放exit,则里外三层循环各执行一次后就终止了,不会printf)
2)与此相似的还有goto-out:用法,不过要少用,只在多层循环使用
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n); // %d写成&d
int one,two,five;
int exit=0;
for(one=1;one<(10*n);one++)
{
for(two=1;two<(5*n);two++)
{
for(five=1;five<(2*n);five++)
{
if((one+two*2+five*5)==10*n) //单位为毛
{
printf("%d元可换为%d张5毛%d张2毛%d一毛\n",n,five,two,one);
// goto out; //层数比较高的for 可以利用goto out;与out:搭配
exit=1;
break; //break要放到if里 不然if为假也会break出去
}
}
if(exit==1) break; //break接力
}
if(exit==1) break;
}
// out:
return 0;
}
- 打印规格化和输出个数
1)一行想输出五个,可以设置一个计数器cnt,利用cnt%5打印换行符
输出的数如果想对齐可在“%d”后加个\t
2)输出个数主要观察if里变量在循环体中第一遍中初始值,另外0-9是包含10个数非9个
#include<stdio.h>
int isPrime(int n);
int main()
{
int n; //给定整数大于一
scanf("%d",&n);
int cnt=0;
int i;
for(i=2;i<=n;i++){
if(isPrime(i)) // return没有返回 则定为0
{ if(cnt%5==0)
{
printf("\n"); //进来的cnt=0 后加一 为一个
} //进来的cnt=49 后加一 为第五十个
printf("%d/%d\t ",i,cnt); // 0 -49 50个数
cnt++;
}
if(cnt>49) break;
}
return 0;
}
int isPrime(int n)
{ int flag=0;
for(int i=2;i<n/2;i++)
{
if(n%i==0)
{
flag=1;
break; //直接跳出循环
}
}
if(flag==0) return n;
}
- 正负型前n项和
1)此题我想的是运用高数奇偶项正负规律来给sum赋值,但第一遍少了一个else分支,下次注意
2)最简单的解法是利用double sign,既可以少一个1.0,又可以简化理解。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double sum;
int sign=1;
int i;
for(i=1;i<=n;i++)
{
/* sum+=sign*1.0/i; //最简便的是不要1.0, sign定义为double 1.0
sign=-sign;
*/
if(i%2==0)
{
sum+=-(1.0/i); //先A后B 要加else
}else
{
sum+=1.0/i;
}
}
printf("%f",sum);
return 0;
}
浙公网安备 33010602011771号