0
点赞
收藏
分享

微信扫一扫

C语言基础演练(5)

题目要求(一):

求100之内任意两个正整数的最大公约数和最小公倍数。

递归和迭代思想:

>>迭代(iteration):每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。(A重复调用B)

>>​递归(recursion):在数学和计算机科学中,指的是在函数定义中使用函数自身的方法。(A调用A).

1)迭代思想:(A重复调用B)

int gcd(int a,int b){ //两个正整数,且a>b

int rem;  //保留余数

while(b>0){

rem=a%b;  //取余

a=b;

b=rem;

}

return a;

}

2)递归思想:(A调用A)

int gcd(int a,int b){ //两个正整数,规定a>b

if(b>0){

return gcd(int b,a%b);

return a;//a最后是最大公约数

}

}

注:最大公约数——gcd:Greatest Common Divisor

知识点:

1.标准输入函数scanf()和输出函数printf();

2.if(){}控制结构、while(){}循环语句;

3.最大公约数与最小公倍数基本概念;

1)对于a/b,若其可以整除,则a是b的倍数,b是a的约数;

2)两个自然数互为质数,则最大公约数是1,且最小公倍数是两个数的乘积。

注:质数,即素数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整;

3)由于两个自然数最大公约数和最小公倍数的乘积等于两个自然数的乘积,因此求出最大公约数,就能求出最小公倍数。

4)最大公约数求法——辗转相除法

两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。

计算公式:gcd(a,b) = gcd(b,a%b),

示例:

​gcd(199,100)

199/100=1(余99)  gcd(100,99)

100/99=1(余1)  gcd(99,1)

99/1=99(余0)  最大公约数为1​

代码:

>>迭代思想

#include <stdio.h>
int gcd(int a,int b);//声明
int main(){
int a,b,c;
scanf("%d %d",&a,&b);
c=gcd(a,b);//求最大公约数
printf("最大公约数%d,最小公倍数%d.\n",c,a*b/c);//a*b/c有基本概念3)得到
return 0;
}

//函数定义
int gcd(int a,int b){ //两个正整数,且a>b
int rem; //保留余数
while(b>0){
rem=a%b; //取余
a=b;
b=rem;
}
return a;
}

>>递归思想

#include <stdio.h>
int gcd(int a,int b);//声明
int main(){
int a,b,c;
scanf("%d %d",&a,&b);//输入两个正整数
c=gcd(a,b);//求最大公约数
printf("最大公约数%d,最小公倍数%d.\n",c,a*b/c);//a*b/c有基本概念3)得到
return 0;
}

//函数定义
int gcd(int a,int b){ //两个正整数,且a>b
if(b>0){
return gcd(int b,a%b);
return a;//a最后是最大公约数
}
}

输出:

100 99
最大公约数1,最小公倍数9900.

题目要求(二):

多组输入一个整数,判断是否为素数。

算法思想:

对任意大于2的整数n,循环分别除以2,3,....,n/2,如果有一个能够被整除的话,就不是质数。

知识点:

1.标准输入函数scanf()和输出函数printf();

2.if(){}控制结构

3.多组输入处理方法

while(~scanf("%d",&n)){}或while(scanf("%d",&n)!=EOF){}

3.素数概念

1)素数:又称为质数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。

      2)合数 :除质数(素数)外的数都是合数。

3)1和0既不是质数也不是合数,2是素数。

代码:

#include <stdio.h>
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF){

int flag;//定义标识符,来判定是否为素数
if(n<=1) //1和0既不是质数也不是合数
flag = -1;
else if(n>=2)
{
flag = 1;
int i;
//判定是否为素数
for(i=2; i<=n/2; i++)
{
if(n%i==0)
{
flag = 0;
break;//跳出for()循环
}
}
}
if(flag == -1)
printf("%d不是质数也不是合数。", n);
else if(flag == 0)
printf("%d不是质数。", n);
else if(flag == 1)
printf("%d是质数。", n);
}
printf("\n");
return 0;
}

输出

1
1不是质数也不是合数。
3
3是质数。
5
5是质数。
4
4不是质数。

_________________________END_________________________

举报

相关推荐

0 条评论