素数
判断一个数是不是素数
重点:变量isPrime作为标志,用来判断,用break跳出循环。程序中可设这种变量作为标志。
printf("--------------判断一个数是不是素数------------\n");
int num1;
printf("请输入一个整数:");
scanf("%d", &num1);
int k;
int isPrime = 1;
for(k=2;k<num1;k++)
{
if (num1%k == 0)
{
isPrime = 0;
break;//continue;
}
//printf("%d\n",k);
}
if (isPrime==1)
{
printf("这个数是素数。\n");
}else
{
printf("这个数不是素数。\n");
}
减少循环次数方法一
方法:偶数不参与循环,可直接被判断为不是素数。每次循环加2。
//简化素数问题:循环走n/2遍/走平方根遍
int isPrime(int x)
{
int ret=1;
int i;
if (x==1 || (x%2==0 && x!=2))
ret=0;
for(i=3;i<x;i+=2)
{
if(x%i==0)
{
ret=0;
break;
}
}
}
减少循环次数方法二
输出0-25之间所有的素数。
方法:构造一个长度为25的数组,数组下标即为对应的数字,数组元素的值代表这个数是不是素数,1为是,0为不是。通过标记每个数的倍数不是素数循环。
#include <stdio.h>
#include <stdlib.h>
//构造素数表
//数组元素值为1的是素数
int main()
{
const int maxNumber = 25;
int isPrime[maxNumber];
int i;
int x;
//赋初值
for(i=0;i<maxNumber;i++){
isPrime[i] = 1;
}
for(x=2;x<maxNumber;x++){
if(isPrime[x]){
for(i=2;i*x<maxNumber;i++){
inPrime[i*x] = 0;
}
}
}
for(i=2;i<maxNumber;i++){
if(isPrime[i]){
printf("%d\t",i);
}
}
printf("\n");
return 0;
}
构造素数表
100个素数组成的表。
方法:每加入一个数都判断是否能被已知的并且小于自己的素数整除。
#include <stdio.h>
#include <stdlib.h>
//再简化:判断是否能被已知的并且小于自己的素数整除
int isPrime(int x, int knownPrimes[],int numofknownPrimes)
{
int ret =1;
int i;
for(i=0;i<numofknownPrimes;i++){
if(x%knownPrimes[i]==0){
ret=0;
break;
}
}
return ret;//ret=1说明是素数,1为真
}
int main()
{
const int number = 100;//数组长度
int prime[100] = {2};//初始化数组
int count = 1;
int i = 3;
while(count<number)
{
if (isPrime(i,prime,count))
{
prime[count++] = i;//更新素数表
//这一行代码做了两件事情
//1 prime[count]=i;
//2 count++;
}
i++;
}
for(i=0;i<number;i++)
{
printf("%d", prime[i]);
if((i+1)%5) printf("\t");
else printf("\n");
}
return 0;
}
输出100以内的素数
printf("--------------输出100以内的素数-------------\n");
int m;
for(m=2;m<=100;m++)
{
int n;
int isPrime1 = 1;
for(n=2;n<m;n++)
{
if (m%n == 0)
{
isPrime1 = 0;
break;//continue;
}
//printf("%d\n",k);
}
if (isPrime1 == 1)
{
printf("%d ", m);
}
}
printf("\n");
求最大公约数
穷举法
printf("------------------求最大公约数------------------\n");
int a,b;
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
int min;
if(a>b)
{
min = b;
}
else{
min = a;
}
int j;
int ret;
for(j=1; j<min; j++)
{
if(a%j == 0)
{
if(b%j == 0)
{
ret = j;
}
}
}
printf("%d和%d的最大公约数是%d.\n",a,b,ret);
辗转相除法
printf("------------------求最大公约数------------------\n");
int a,b;
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
/*
辗转相除法:如果b为0,a就是最大公约数。否则,计算a%b,另a=b,b=a%b
a b t
12 18 12
18 12 6
12 6 0
6 0
*/
while(b!=0){
int t= a%b;
a=b;
b=t;
}
printf("最大公约数为:%d\n", a);