第五次作业
#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语句运用的强化,以及多个循环并列使用来完成算法,加深了对于循环的理解
代码行数
博客园字数