第五次作业

#include <stdio.h>
#include <math.h>
int main()
{
    int n, i, flag;
           int x;
    scanf("%d", &n);
    while(n--){
        scanf("%d", &x);
        flag = 1;
        for(i = 2; i <= sqrt(x); i++){
            if(x % i == 0){
                flag = 0;
                break;
            }
        }
        if(x == 1 || flag == 0)
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}

2.设计思路

第一步:改题目要求判断素数首先确定利用while进行循环来实现;利用n--来简化循环是否继续的条件

第二步:利用素数的数学性质来减少程序的运行时间,即用i <= sqrt(x);x % i == 0这两句语句来减少原本运行到底的程序运行时间

第三步:根据题目要求,需要我们输出YES和NO,因此,利用变量flag作为标志来确定输出量是yes或者是no

第四步:最后再次考虑素数性质,排除1这个特殊情况后,进行程序的编写

3.流程图

4.遇到的问题以及解决方案

a.没有使用素数的数学工具而导致整个程序的运行超时       解决方案:使用素数的性质来减少程序的用来判断的时间

#include<stdio.h>
int main()
{
    int n,i,min,max,t,a[10],k,c;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    min=a[0];
    for(i=1;i<n;i++){
        if(min>a[i]){
            min=a[i];
            c=i;
        }
    }
    t=a[0];a[0]=a[c];a[c]=t;
    max=a[0];
    for(i=1;i<n;i++){
        if(max<a[i]){
            max=a[i];
            k=i;
        }
    }
    t=a[n-1];a[n-1]=a[k];a[k]=t;
    for (i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;

    
}

2.设计思路

第一步:题目要求输入一组数并交换其中的最大和最小值,所以采用循环结构来给这一数组赋值

第二步:题目要求先交换题目中的最小值到首位在将最大值交换到最后一位,并且数组个数确定;因此决定采用for语句进行循环交换,将数逐个进行比较并且最后决定与哪个数交换

第三步:利用常规的数值交换语句来进行交换 ,即 t=a[0];a[0]=a[c];a[c]=t;

第四步:由于无论如何都必须从头开始逐个比较因此变量max和min都必须赋a[0]的值

第五步:利用变量c和变量k来存放数组中符合条件的值的数组下标

第六步:因为向前交换和向后交换有所不同,必须加以区别

3.流程图

4.遇到的问题以及解决方案

a.第一次编写时忽略了末尾交换和首位交换的差别导致了答案的错误    解决方案:末尾交换数组最后一个数字的下标应该为n-1而并非n

学习内容:while语句运用的强化,以及多个循环并列使用来完成算法,加深了对于循环的理解

代码行数

博客园字数

王肖

崔鸿琛

商立泽

 

posted @ 2018-12-16 19:24  楼哲  阅读(246)  评论(3编辑  收藏  举报