C语言练习笔记
第一次记录了一些控制语句相关的小例程,忘了做归纳,本次开始先附上控制语句的分类。
最近写了几个函数和递归法相关的例子,如下。
1.确定圆周率Π的值用蒙特卡洛法
要求:输入N为投掷次数(2<=N<=5000)
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
main()
{
do{
int RM,p,ci;
int i,yuan;
float pi,x,y,r;
RM=RAND_MAX;
yuan=0; //未赋初值会导致结果错误
do{
printf("请输入投掷次数N:");
scanf("%d",&ci);
}while((ci<2)||(ci>50000));
for(i=1;i<=ci;i++)
{
p=rand();
x=((float)p)/RM;
p=rand();
y=((float)p)/RM;
r=sqrt((x*x)+(y*y));
if(r<=1)
yuan=yuan+1;
}
pi=4*((float)yuan)/ci;
printf("%f\n",pi);
}while(1);
}
2.用删除法删除掉1~N中的非质数,输出一个质数数组。
方法提示:可删除2的倍数(除了2),3的倍数,5的倍数……下一个未删除数的倍速,直到根号N。
#include<stdio.h>
#include<math.h>
#define SIZE 1000
int a[SIZE];
void sieve()
{
int i,j,sq;
for(i=0;i<SIZE;i++)
{
a[i]=0;
}
sq=sqrt(SIZE);
for(i=4;i<=SIZE;i+=2)
{
a[i]=1;
}
for(i=3;i<=sq;i+=2) //j小于等于sq 仅需删除到根号N
{
if(a[i]==0)
{
for(j=i*2;j<=SIZE;j+=i)
a[j]=1;
}
}
a[1]=1;
}
main()
{
int i,N;
sieve(); //删除函数
printf("生成数组为1~%d:",N);
scanf("%d",&N);
for(i=1;i<N;i++)
{
if(a[i]==0)
printf("%3d",i); //输出剩下的数
}
}
3.输入一个数N,用递归法对1~N求和。
PS:递归法是C语言中最常用的方法之一,核心是在子函数中不断调用自己,须掌握此方法。
#include<stdio.h>
int summation(int sum) //累加子函数 形参为sum
{
if(sum==1) sum=1;
else sum=sum+summation(sum-1); //调用自己即递归
return sum;
}
main()
{
int N,R;
printf("请输入要计算的数:");
scanf("%d",&N);
R=summation(N); //实参为N传入子函数,计算累加和
printf("%d",R);
return(0);
}
4.输入一个数N,用递归法求N的阶乘。
#include<stdio.h>
int fib(int F)
{
int a;
if(F<=1) a = 1;
else a = F*fib(F-1);
return a;
}
main()
{
int N,B,i;
while(1)
{
printf("N的阶乘:\n");
scanf("%d",&N);
B=fib(N); //实参不写类型
printf("%d",B); //循环 打印数列
printf("\n");
}
return (0);
}
5.用递归法求斐波那契数列
斐波那契数列是第N项为前两项的和,第0项和第1项可自己任意给出,本程序中给前两项分别赋值0和1。
#include<stdio.h>
/*int fib(int F)
{
if(F==1) return 0;
if(F==2) return 1;
if(F>2) return (fib(F-2)+fib(F-1));
}
main()
{
int N,B,i;
while(1)
{
printf("列数前N项斐波那契数:\n");
scanf("%d",&N);
B=fib(N); //实参不写类型
for(i=1;i<=N;i++)
{
printf("%3d",fib(i)); //循环 打印数列
}
printf("\n");
}
return (0);
}
可能还没有做一些指针相关的题目,感觉也不是那么难,以前有一点被程序唬到了,继续加油,不秃头!