• 主辅函数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;
 }

 

posted on 2022-05-08 20:51  Niu的呀  阅读(175)  评论(0)    收藏  举报