您的位置:首页 > 编程语言 > C语言/C++

<C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)

2017-08-12 12:02 1186 查看
作者:wsg

时间:2017年8月12日

学习重要的是会举一反三,能够自我总结,自己思考!

题目:输入一个整数,输出比它小包括等于它的所有素数

1、把需要的基础功能做出来:首先,素数怎么求? 再者,怎么实现输出比它
4000
小包括它本身的素数?

2、这个程序输入为1或者负数的时候,能让程序输出错误提示,并且不会退出程序,再给机会重新输入吗?

(此时并没有实现输入正确的时候,程序也不会退出)

3、在2的基础上,让程序输入错误或者正确的时候都不会退出程序

4、实现第2或3步有哪几种实现方法?

一、素数的概念是只能被1和它本身整除的数,本来1也满足素数的定义,但是在数学上,1被规定为不是素数。

关于整除,联想到C语言中有个%求余或者取模,若一个数,挨个去%比它小或者等于的数,若i%j== 0的次数为2,

也就是j = 1或者j = i的时候,i即为素数。挨个除,想到for循环语句能够快速的实现。

/*****************
功能:输入一个整数,输出比它小包括它本身的所有素数
作者:wsg
时间:2017年8月11日
版本一
*****************/
#include <stdio.h>

int main(int argc, char *argv[])
{
int nu;
printf("请输入一个正整数:\n");
scanf("%d", &nu);

int i,j;
printf("\n%d以内的所有素数是:\n", nu);
for(i=1; i<=nu; i++)
{
int k = 0;
for(j=2; j<=i; j++)
{
if(i%j == 0)
{
k++;
}
}
if(k == 1)
{
printf("%d\t", i);
}
}
printf("\n");
return 0;
}


程序运行:



二、输入1或者负数的时候提示输入错误,采用一个if判断语句得到很好的解决,if(nu<-=1)    prntf();即可。怎么让提示了之后不退出呢,即想到C语言中有个无条件转移语句goto,打印从无之后即goto到输入这个数语句处即可。

/*****************
功能:输入一个整数,输出比它小包括它本身的所有素数
作者:wsg
时间:2017年8月11日
版本二:如果输入的不是大于1的数,则重新输入
*****************/
#include <stdio.h>

int main(int argc, char *argv[])
{
int nu;
LOOP:
printf("请输入一个正整数:\n");
scanf("%d", &nu);

if(nu<=1) //因为1满足素数的判断条件,但是规定1不是素数,所以要排除掉
{
printf("非法输入!请重新输入!\n\n");
goto LOOP;
}

printf("\n%d以内的所有素数是:\n", nu);

int i,j;
for(i=1; i<=nu; i++)  //判断是否是素数
{
int k = 0;
for(j=2; j<=i; j++)
{
if(i%j == 0)
{
k++;
}
}
if(k == 1)
/***k的作用就是限制i%j == 0的次数,因为j是从2开始的,
所以i%i == 0时就是本身才能整除本身,此时k=1.比如nu=7%(j=2;j<=7;j++),只有j=7时才会整除。
若nu = 6; 那么j=2或3或6的时候i%j == 0,此时k == 3,就不是素数,就不打印。
此段描述有点困难,作者能力有限,敬请谅解!
***/
{
printf("%d\t", i);
}
}
printf("\n");
return 0;
}
程序运行:



三、既然输如为1或者负数的时候能够重更新输入,那么能不能输入正确的时候也能够一直运行下去呢?搜先我想到了使用一个"死循环"--while(1),程序一直循环在其中,除非人为地强制退出,否则不会自动退出。

/*****************
功能:输入一个整数,输出比它小包括它本身的所有素数
作者:wsg
时间:2017年8月11日
版本三:使用了while循环语句使程序不会自动退出,可以连续输入输出
*****************/
#include <stdio.h>

int main(int argc, char *argv[])
{
while(1)
{
int nu;
printf("请输入一个正整数:\n");
scanf("%d", &nu);

if(nu<=1) //因为1满足素数的判断条件,但是规定1不是素数,所以要排除掉
printf("非法输入!请重新输入!\n\n");

if(nu>1)
printf("\n%d以内的所有素数是:\n", nu);

int i,j;
for(i=1; i<=nu; i++)  //判断是否是素数
{
int k = 0;
for(j=2; j<=i; j++)
{
if(i%j == 0)
{
k++;
}
}
if(k == 1)
/***k的作用就是限制i%j == 0的次数,因为j是从2开始的,
所以i%i == 0时就是本身才能整除本身,此时k=1.比如nu=7%(j=2;j<=7;j++),只有j=7时才会整除。
若nu = 6; 那么j=2或3或6的时候i%j == 0,此时k == 3,就不是素数,就不打印。
此段描述有点困难,作者能力有限,敬请谅解!
***/
{
printf("%d\t", i);
}
}
printf("\n");
}
return 0;
}
运行结果:



四、第二步不是使用了goto语句实现了输入错误的时候能继续输入吗?那么能否使用goto来代替第三步中的while呢?

仔细思考过后,发现使用两个goto语句即可。第一个还是与第二步一样,使用在输入错误提示之后;第二个呢,则放在输出答案之后,程序结束(return 0)之前。

/*****************
功能:输入一个整数,输出比它小包括它本身的所有素数
作者:wsg
时间:2017年8月11日
版本四:goto语句实现与版本三一样的功能
*****************/
#include <stdio.h>

int main(int argc, char *argv[])
{

int nu;
LOOP:
printf("请输入一个正整数:\n");
scanf("%d", &nu);

if(nu<=1) //因为1满足素数的判断条件,但是规定1不是素数,所以要排除掉
{
printf("非法输入!请重新输入!\n\n");
goto LOOP; //goto LOOP: 无条件转移到LOOP处,程序又从LOOP出开始执行
}
printf("\n%d以内的所有素数是:\n", nu);

int i,j;
for(i=1; i<=nu; i++)  //判断是否是素数
{
int k = 0;
for(j=2; j<=i; j++)
{
if(i%j == 0)
{
k++;
}
}
if(k == 1)
/***k的作用就是限制i%j == 0的次数,因为j是从2开始的,
所以i%i == 0时就是本身才能整除本身,此时k=1.比如nu=7%(j=2;j<=7;j++),只有j=7时才会整除。
若nu = 6; 那么j=2或3或6的时候i%j == 0,此时k == 3,就不是素数,就不打印。
此段描述有点困难,作者能力有限,敬请谅解!
***/
{
printf("%d\t", i);
}
}
printf("\n");
goto LOOP;
return 0;
}
运行程序:



小编水平有限,如有不足或错误之处,欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐