素数判断&&求m内能被3整除的所有数之和

来源:互联网 发布:值乎app 编辑:程序博客网 时间:2024/05/16 14:14

item 1:输入一个正整数,判断其是否为素数并输出

代码

/**Copyright @2017,CSDN学院*All rights reserved.*文件名称:main.c*作    者:袁生*完成日期:2017年10月24日*版 本 号:v1.0*问题描述:输入一个正整数,判断它是不是素数并输出*/#include <stdio.h>#include<math.h>int main(){    unsigned int m,i,k;    printf("请输入正整数m:");    scanf("%d",&m);    k=sqrt(m);    if(m==0||m==1)        printf("%d 既不是素数也不是合数",m);    else    {        if(m==k*k)            printf("%d 不是素数",m);        else        {            for(i=2;i<k;i++)                if(m%i==0)break;            if(i>k)                printf("%d 是素数",m);            else                printf("%d 不是素数",m);        }    }    return 0;}

心得

先排除特殊情况(m=0或m=1),再进行系统分析是必要的。此外,优先排除平方数可以提高运算效率,所以在循环之前加了个if(m==k*k)语句。最后在循环条件i<k还是i≤k时斟酌是否要等号,经分析觉得没所谓,因为经验证break执行后直接跳出循环,i++最后一次不会执行,故等号不影响i>k的结果(但如果循环后的if(i>k)变为if(i>=k)且没有循环语句前的平方数排除判断if(m=k*k)的话,if(i>=k)会在m为平方数时有效从而改变结果);下面看一个程式

void main(){ int m,i,k;printf("please input a number:\n");scanf("%d",&m);k=sqrt(m);for(i=2;i<k;i++)if(m%i==0) break;if(i>=k)printf("该数是素数");elseprintf("该数不是素数");}
当m=0,1,4时,该程序输出结果为“该数是素数”,明显不对,应该更周全些,除了像第一个程序排除特殊情况m=0,1外,还要警惕平方数如9(3²),按示例也会输出“该数是素数”的错误结果,所以循环后的if语句判断条件还要去掉等号变为if(i>k)。写循环语句时要注意循环条件中等号的选择,有时候多一个等号就会导致错误的结果,还要随时注意特殊情况的存在,谨记!!!

item 2:输入一个正整数m,求[1,m]区间内所有能被3整除的数之和并输出和。

代码

/**Copyright @2017,CSDN学院*All rights reserved.*文件名称:main.c*作    者:袁生*完成日期:2017年10月24日*版 本 号:v1.0*问题描述:输入一个正整数m,求[1,m]内能被3整除的所有数之和输出*/#include <stdio.h>#include<math.h>int main(){    unsigned int m,i,sum=0;    printf("请输入正整数m:");    scanf("%d",&m);    //方法一:    /*for(i=3;i<=m;i++)    {        if(i%3==0)            sum+=i;    }*/    //方法二:    sum=(3+(m/3)*3)*(m/3)/2;    printf("[1,m]内能被3整除的所有数之和为:%d",sum);    return 0;}
心得

这题目很简单,关键是打破常规思维的方法二,通常情况下我们思路都是从3开始找能被3整除的数一直找到m,也就是方法一,但方法二另辟蹊径,想到满足条件的数会构成等差数列,利用高斯的求和公式可以计算,于是找到这些数构成的等差数列的首项3,尾项m/3*3(注意这个结果不一定是m,m/3是取整的,如果m不是3的倍数m/3将取整数部分),项数m/3(同样这个也是取整),根据高斯求和公式可以一步到位求所有[1,m]内能被3整除的数之和。

原创粉丝点击