分享

C经典问题整理(一)(素数,公倍公约数,斐波那契数列)

 panhaosun 2011-10-14

素数:

按照素数的定义,可以用2~number-1的所有证书去除number,只要有能整除的,便说明number不是素数。不过对任意值的number检验它是否为素数时,不必使用比其平方根大的数取整除它

#include <stdio.h>

#include <math.h>

int IsPrimeNumber(int number);

void main()

{

int a;

printf("Input a integer number: ");

scanf("%d",&a);

if (IsPrimeNumber(a))

{

printf("%d is prime number.\n",a);

}

else

printf("%d isn't prime number.\n",a);

}

int IsPrimeNumber(int number)

{

int i;

if(number<=1) return 0;

for(i=2;i<sqrt(number);i++)

{

if(number%i==0) return 0;

return 1;

}

}

最大公约数与最小公倍数:欧几里德算法(辗转相除法),计算原理依赖如下定理:

gcd(a,b)=gcd(b,a mod b)

code:

#include <stdio.h>

void swap(int*a,int*b);

int MaxCommonFactor(int a,int b);//最大公约数

int MinCommonMultiple(int a,int b);//最小公倍数

void main()

{

int x,y,z,p;

scanf("%d,%d",&x,&y);

z=MaxCommonFactor(x,y);

p=MinCommonMultiple(x,y);

printf("%d,%d\n",z,p);

}

void swap(int*a,int*b)

{

int temp;

temp=*a;

a=b;

*b=temp;

}

int MaxCommonFactor(int a,int b)

{

int temp;

if (b>a)

{

swap(&a,&b);

}

while(a%b!=0)

{

temp=b;

b=a%b;

a=temp;

}

return b;

}

int MinCommonMultiple(int a,int b)

{

return (a*b)/MaxCommonFactor(a,b);//最小公倍数=两数相乘/最大公约数

}

斐波那契数列:

其第一项和第二项的值都为1,以后各项的值为其前两项值之和。所以要计算第n项的值f(n),可以列出其递归式f(n)=f(n-1)+f(n-2),当n=12时,其值为1

方法一:

#include <stdio.h>

void main()

{

int i;

int a[40];

a[0]=a[1]=1;

for (i=2;i<40;i++)

{

a[i]=a[i-1]+a[i-2];

}

for (i=0;i<40;i++)

{

printf("%d\t",a[i]);

}

}

方法二:(递归)注:效率不高

#include <stdio.h>

int f(int number);

void main()

{

int i,k;

for (i=1;i<=40;i++)

{

k=f(i);

printf("%d\t",k);

}

}

int f(int number)

{

if (number<=2)

{

return 1;

}

else return (f(number-1)+f(number-2));

}
素数:
#include"stdio.h"
void main()
{int n,i;
for(n=0;n<=500;n++)
{for(i=2;i<=n-1;i++)
if(n%i==0)break;
if(i>=n)printf("%d\t",n);}
}


最大公约数:
#include<stdio.h>
void main()
{int m,n,r;
printf(" 请输入两个数");
scanf("%d,%d",&m,&n);
while(1)
{r=m%n;
if(r==0)break;
else {m=n;
n=r;}}
printf("%d",n);

}



最小公倍数
#include<stdio.h>
void main()
{int m,n,r,t;
int static s;
printf(" 请输入两个数");
scanf("%d,%d",&m,&n);
s=m*n;
while(1)
{r=m%n;
if(r==0)break;
else {m=n;
n=r;}}
t=s/n;
printf("%d",t);

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多