PTA循环实验

题目一:7-5

1.本题PTA提交列表

2.设计思路(包括流程图),主要描述题目算法

1.在给出的一系列数字中找取最小的数

2.说明要在输入的数中一个一个进行比较选取最小的数

3.如输入第一个数与一开始定义的0为最小数比较,比较小的数字作为目前的最小数,接着再与第二个数字进行比较

最终的代码如下

#include<stdio.h>
int main()
{
    int n,i,j,min=0,temp=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&j);
        if(j<min) min=j;
        else j=temp; 
    }
    printf("min = %d",min);
}

但是发现有问题

没有考虑到当最小值大于0比一开始定义的最小值0大的这种情况

所以在判断完输入的数字与min的比较后再添加一个if判断语句

避免此系列的数字都大于0,比初始定义的0还要大的情况。

#include<stdio.h>
int main()
{
    int n,i,j,min=0,temp=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    scanf("%d",&j);    
    if(j<min) min=j;
    else if(n==1) min=j; 
  }
    printf("min = %d",min);
}

得到的结果

 

题目二:7-6

1.本题PTA提交列表

 2.设计思路(包括流程图),主要描述题目算法

此题目用到了循环嵌套

1.内存循环中是判断输入的这个数是否为素数,并且当他为素数的时候直接加到sum中

2.外循环是用来输入m到n区间的所有数

由此写出的代码是

 

#include<stdio.h>
#include<math.h>
int main()
{
    int M,N,n,i,k,a=0,b=0;
    1<=M<=N<=500;
    scanf("%d %d",&M,&N);
    for(n=M;n<=N;n++)
    {
        k=sqrt(n);
        for(i=2;i<=k;i++)
            if(n%i==0)break;
            if(i>=k+1) 
            {
                a++;
                b+=n; 
            }
    }
     printf("%d %d",a,b);
 } 

发现产生了以下错误

 经过各种排查终于找出是因为我将1当作素数计算 所以导致了错误

在if中直接将0和1排除在外

得到代码如下

#include<stdio.h>
#include<math.h>
int main()
{
    int M,N,n,i,k,a=0,b=0;
    1<=M<=N<=500;
    scanf("%d %d",&M,&N);
    for(n=M;n<=N;n++)
    {
        k=sqrt(n);
        for(i=2;i<=k;i++)
            if(n%i==0)break;
            if(i>=k+1&&n!=1&&n!=0) 
            {
                a++;
                b+=n; 
            }
    }
     printf("%d %d",a,b);
 } 

运行后得到

 

 

题目三:7-7

1.本题PTA提交列表

2.设计思路(包括流程图),主要描述题目算法

此题目比一道类似的经典题目的区别就是不是直接的数字累加而是每次的数字先累乘之后再累加

只需要在累加之前处理一下所要加的数字就可以实现了

 

 

#include<stdio.h>
int main()
{
    int N,i,b,S=0,a=1;
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
      b=i;
      a=a*b;
      S=S+a;    
    } 
    printf("%d",S);
 } 

但是却发现结果不对

通过观察发现 一开始讲i=0是不对的,这样导致所有的数据乘以一开始的0都为0,

修改循环处的语句得到

#include<stdio.h>
int main()
{
    int N,i,S=0,a=1;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
      a=a*i;
      S=S+a;    
    } 
    printf("%d",S);
 } 

运行后发现结果正确

 

 

 二、同学代码互评(7-6)

我的代码

#include<stdio.h>
#include<math.h>
int main()
{
    int M,N,n,i,k,a=0,b=0;
    1<=M<=N<=500;
    scanf("%d %d",&M,&N);
    for(n=M;n<=N;n++)
    {
        k=sqrt(n);
        for(i=2;i<=k;i++)
            if(n%i==0)break;
            if(i>=k+1&&n!=1&&n!=0) 
            {
                a++;
                b+=n; 
            }
    }
     printf("%d %d",a,b);
 } 

2.同学 杨良的代码

#include<stdio.h>
main()
{
    int M,N,i,j,sum=0,count=0;
    scanf("%d %d",&M,&N);
    for(i=M;i<=N;i++){
        for(j=2;j<i;j++){ 
            if(i%j==0)
            break;
        }
        if(i==j){
        sum+=i;
        count++;}
        
    }
    printf("%d %d",count,sum);    
 } 

3.我和同学的代码有哪些不同?各自有哪些优势?你更喜欢那种代码的风格?

   我的代码循环次数较少,时间复杂度比较低,他的代码思路更清晰

           我觉得我可以将我的程序更加的简化就会更完美了

四、本周学习总结

  1.本周你学会了什么?

   1.本周学会了for循环和while以及do....while 循环的基本运用

   2.以及深入了解了for和while循环嵌套

   3.for和while循环的判断条件等

  2.本周的内容,还有那些内容不会?

   没有分清素数

      部分循环写的有点不清晰

      简单的代码都要写很久速度太慢不够熟练

posted @ 2017-12-28 21:07  Kalim  阅读(228)  评论(0编辑  收藏  举报