小编近日在重新学习C语言基础知识,发现了很多的盲点,当初上学的时候不理解的东西,现在看看也理解了很多,今天写一写最近学过的C语言的基础算法。一些很基础的算法,以后A题会用的到哦!
- 输出斐波那契数列
1、用for循环输出斐波那契数列前20个数(很基础哦!)
#include<stdio.h>
void main(){
int a,b,i;
for(a=1,b=1,i=1;i <= 10;i++){
printf("%d\t%d\t",a,b);
a=a+b;
b=b+a;
if(i%2==0){
printf("\n");
}
}
}
2、将斐波那契数列前40个数放入一个数组f中,并循环输出数组元素
方法一:
#include<stdio.h>
main(){
int a,b,i,f[40],*p;
p=f;
for(a = 1,b = 1,i = 0;i < 40; i++){
f[i]=a;
f[++i]=b;
a=a+b;
b=b+a;
}
for(i = 0;i < 40;i++){
printf("%12d",*(p+i));
}
return 0;
}
方法二:
#include<stdio.h>
main(){
long f[40]={1,1},*p;
int i;
p=f;
for(i = 2;i < 40;i++){
f[i]=f[i-1]+f[i-2];
}
for(i = 1;p < f+40; i++,p++){
printf("%12d",*p);
if(i%4==0)
printf("\n");
}
}
- 素数
1、求一个数m是否为素数;
#include<stdio.h>
main(){
int m,c=2;
scanf("%d",&m);
while(m%c!=0){
c++;
}
if(m==c){
printf("%d is a prime number.\n",m);
}
else{
printf("%d is not a prime number.\n",m);
}
}
2、求200-230之间的全部素数。
提示:如果一个数m不能被2到√m中任一数整除,就可以确定这个数是素数。(可以降低时间复杂度哦)
#include<stdio.h>
#include<math.h>
main(){
int m,i,j,k;
for(i=201;i < 2000;i+=2){
m = (int)sqrt(i);
for(j = 2;j <= m;j++){
if(i%j==0)
break;
}
if(j > m){
printf("%12d",i);
}
}
}
- 求两数最大公约数和最小公倍数
最大公约数要用取余迭代的方式求出,最小公倍数=两数乘积/最大公约数
#include<stdio.h>
main(){
int a,b,c,m,n;
scanf("%d%d",&a,&b);
m = a,n = b;
for(c=a%b ; c!=0 ; a=b,b=c,c=a%b);
printf("%d is the largest common divisor\n",b);
printf("%d is the least common multiple\n",m*n/b);
}
- 用指针的方式输出数组
要想学会C语言的指针就要充分理解&和 * 的含义。
&多种用途,这里主要说它是取地址运算符。
*为取内容运算符
下面展示一些指针数组的用法
#include<stdio.h>
main(){
int a[8]={1,2,3,4,5,6,7,8};//a是指针常量
int i,*p;//p是指针变量
for(i = 0 ;i < 8;i++){
printf("%6d",a[i]);
}
printf("\n");
for(p=a;p < a+8;p++){
printf("%6d",*p);
}
printf("\n");
}
- C语言中字符串和字符的理解
以一段代码的形式给大家展示
#include<stdio.h>
main(){
char s = 'a';//字符
char *p = "This is a string!";//字符串数组
printf("%c\n",s);//输出字符串
while(*p!='\0'){//字符串数组以\0结尾
printf("%c",*p) ;
p++;
}
}
- 冒泡排序
经典中的经典,冒泡排序算法。将乱序排列的数字按从小到大的顺序排列,大数沉底,小数上浮。
#include<stdio.h>
#define N 5
main(){
int a[N],i,j,t,*p;
for(p = a;p < a+N;p++){
scanf("%d",p);
}
for(i = 0;i < N-1;i++){
for(j = 0;j < N-i-1;j++){
if(a[j] > a[j+1]){
t = a[j+1];
a[j+1] = a[j];
a[j] = t;
}
}
}
for(p = a;p < a+N;p++){
printf("%6d",*p);
}
}
- 二分法查找有序数组中的数
#include<stdio.h>
#define N 6
main(){
int a[6]={-22,-11,2,6,9,23},*p;
p = a;
int low = 0,high = 5;
int x,m;
scanf("%d",&x);
while(low <= high){
m = (low+high)/2;
if(x == *(p+m))
break;//注意跳出循环!
else if(x > *(p+m)){
low = m+1;
}
else{
high = m-1;
}
}
if(low <= high){
printf("%d positon is %d",x,m);
}
else
printf("Not found\n");
}
- 在有序数组中插入一个数,使之仍然有序
#include <stdio.h>
#define N 11
main(){
int a[N] = {-3, -1, 8,16 ,22,23,25,34,47,65};
int i,j,x,*p;
scanf("%d",&x);
for(i = 0,p = a;x > *p && i < N-1; p++,i++);
for(j = N - 1;&a[j]!=p;j--){
a[j]=a[j-1];
}
*p = x;
for(i = 0 ;i < N; i++){
printf("%6d",a[i]);
}
}
上边代码两个for循环用到指针的知识,大家不要混淆,如果有不理解,欢迎评论区骚扰。今天就到这啦!