程序流程控制经典实例
一.C语言判断并求素数(素数是只能被1和本身整除)
方法一:判断n是否能被1~n-1整除
#include <stdio.h>
int main()
{
int i, n;
printf("please input a number:");
scanf("%d", &n);
for (i = 2; i < n ; i++)
{
if (n%i == 0)
break;
}
if (n <=1 )
printf("This is not a prime\n");//n<=1的数当然是非素数
else if (i < n)
printf("This is not a prime.\n");
else
printf("This is a prime.\n");
return 0;
}
求100到200间的全部素数
#include<stdio.h>
int main() {
int i, j, k;
for (i = 101; i < 201;i++)
{
k = 1;
for (j = 2; j <i;j++)
{
if (i%j == 0)
{
k = 0;
break;
}
}
if (k == 1)
printf("%d \n", i);
}
return 0;
}
方法二:判断n是否能被2~√n间的整数整除
#include<stdio.h>
#include<math.h>
int main()
{
int n,i;
double k;
printf("please input a number:");
scanf("%d", &n);
k = sqrt(n);
for (i = 2; i <= k;i++)
{
if (n%i == 0)
break;
}
if (n <=1 )
printf("This is not a prime\n");
else if (i <= k)
printf("This is not a prime.\n");
else
printf("This is a prime\n");
return 0;
}
求100到200间的全部素数
#include <stdio.h>
#include <math.h>
int main()
{
int m, k, i, n = 0;
for(m = 101; m <=200; m = m+2)
{
k = sqrt(m);
for(i = 2; i <= k; i++)
if(m%i == 0)
break;
if(i >= k+1)
{
printf("%d\t", m);
n = n+1;
}
if(n%10 == 0)
printf("\n");
}
printf("\n");
}
二.输入两个正整数 m 和 n,求其最大公约数和最小公倍数(辗转相除法)
#include <stdio.h>
int main()
{
int m,n,k,a,b;
printf("请输入2个正整数,两者间用逗号隔开:\n");
scanf("%d,%d",&m,&n);//输入两个数字时用逗号隔开
//开始判定
if(m<=0||n<=0)//如果两者中在任意一个为小于等于0
{
printf("输入有误,请您输入两个 正!整!数!\n");
}
else
{
//交换两个数,始终让较大的一个等于m,较小的一个数等于n
if(m<n)
{
k=m;
m=n;
n=k;
}
a=m;
b=n;
//利用辗转相除法,直到b等于0为止
while(b!=0)
{
k=a%b;
a=b;
b=k;
}
printf("最大公约数:%d\n",a);
printf("最小公倍数:%d\n",m*n/a);
}
}
三.编程序找出1000之内的完数(完数是指一个数如果恰好等于它的因子之和)
/完数
//一个数如果恰好等于它的因子之和,这个数就称为"完数"。
//例如6=1+2+3.
//例如28=1+2+4+7+14
//例如496=1+2+4+8+16+31+62+124+248
//编程找出1000以内的所有完数。
#include <stdio.h>
void main()
{
int s, i, j, m;
for(i = 1; i <= 1000; i++)
{
s = 0;
for(j = 1; j < i; j++)
if(i%j==0)
s=s+j;
if(s == i)
{
printf("%d its factors are ", s);
for(m = 1; m < s; m++)
if(s%m == 0)
printf("%d\t" , m);
}
printf("\n");
}
}
四.输出所有的水仙花数(水仙花数是指一个3位数,其各位数字立方和等于该数本身)
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c,i;
for(i=100;i<1000;i++) //for 循环,注意范围(i<1000)等价于(i<=999)
{
a=i/100;
b=i/10%10;
c=i%10;
if(i==(pow(a,3)+pow(b,3)+pow(c,3))) //pow(a,3)也可以写成 a*a*a ;
{
printf("%d\n",i);
}
}
return 0;
}
五.求1!+2!+3!+4!+……+20!
#include <stdio.h>
int main()
{
float n,s=0,t=1;
for(n=1;n<=20;n++)
{
t*=n;
s+=t;
}
printf("1+2!+3!...+20!=%e\n",s);
return 0;
}
六.有一分数序列2/1,3/2,5/3,8/5,13/8,21/13……求出这个数列的前20项之和
#include <stdio.h>
void main()
{
double a=1,b=2,s=0,t;
int i;
for(i=0; i<20; i++)
{
s += b/a;
t = a;
a = b;
b += t;
}
printf("和为:%.10f\n",s);
}
七.用牛顿迭代法求下面法求下面方程在1.5附近的根:f(x)=2x3-4x2+3x-6
基本公式为:
Xn+1=Xn-f(Xn)/f *(Xn) 其中Xn+1为第n+1次迭代结果,Xn为第n次迭代结果,f *(Xn)为f (Xn))的导函数值。
基本步骤:
第一步把方程改写为多项式f(x)=2x3-4x2+3x-6,给定初值X0;
第二步将Xn带入迭代公式Xn+1=Xn-f(Xn)/f *(Xn),求出Xn+1
第三步判断精度fabs(Xn+1-Xn)是否达到要求,满足则输出,否则返回上一步;
#include <stdio.h>
#include <math.h>
int main(void)
{
double x1,x0,f1,f;
x1=1.5;
//可以用while或者do while 但是需要进行一次绝对值的比较,所以do while比较方便
//如果用while 的话必须要提前写x1,x0的值和公式
do
{
x0 = x1;
f=(2*pow(x1, 3)-4*pow(x1, 2)+3*x1-6)/(6*pow(x1, 2)-8*x1+3);
f1 = (6*x0-8)*x0+3;
x1 = x0-f/f1;
}
while(fabs(x1-x0) >= 1e-5);
printf("%5.2lf\n", x1);
return 0;
}
八.用二分法求下面方程在(-10,10)之间的根:f(x)=2x3-4x2+3x-6
根据二分法方法:
1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
2 求区间(a,b)的中点c.
3 计算f©.
(1) 若f©=0,则c就是函数的零点;
(2) 若f(a)·f©<0,则令b=c;
(3) 若f©·f(b)<0,则令a=c.
(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4
#include <stdio.h>
#include <math.h>
int main()
{
double a=-10, b=10, c, x, x1, x2, x3;
int i;
for ( i=0; ; i++)
{
c = (a+b)/2;
x1 = 2*pow(a, 3)-4*pow(a, 2)+3*a-6;
x2 = 2*pow(b, 3)-4*pow(b, 2)+3*b-6;
x3 = 2*pow(c, 3)-4*pow(c, 2)+3*c-6;
if (!x3)
x=c;
else if (x1*x3<0)
b=c;
else if (x2*x3<0)
a=c;
if (fabs(a-b) < 1e-8)
{
x = a;
break;
}
}
printf("Root=%lf\n", fabs(x));
return 0;
}