100个超级经典的C语言算法,程序员必须练习

时间:2019-05-14 16:06:42下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《100个超级经典的C语言算法,程序员必须练习》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《100个超级经典的C语言算法,程序员必须练习》。

第一篇:100个超级经典的C语言算法,程序员必须练习

POJ上做做ACM的题

语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔

子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数

为多少?

__________________________________________________________________

程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....___________________________________________________________________

程序源代码: main(){ long f1,f2;int i;f1=f2=1;for(i=1;i<=20;i++){ printf(“%12ld %12ld”,f1,f2);

if(i%2==0)printf(“n”);/*控制输出,每行四个*/

f1=f1+f2;/*前两个月加起来赋值给第三个月*/

f2=f1+f2;/*前两个月加起来赋值给第三个月*/ } }

上题还可用一维数组处理,you try!

题目:判断101-200之间有多少个素数,并输出所有素数。

__________________________________________________________________

程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整

除,则表明此数不是素数,反之是素数。

___________________________________________________________________

程序源代码: #include “math.h” main(){

int m,i,k,h=0,leap=1;printf(“n”);

for(m=101;m<=200;m++)

{ k=sqrt(m+1);

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

if(m%i==0)

{leap=0;break;}

if(leap){printf(“%-4d”,m);h++;

if(h%10==0)

printf(“n”);

}

leap=1;

} printf(“nThe total is %d”,h);}

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位

数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方

+5的三次方+3的三次方。

__________________________________________________________________

程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

___________________________________________________________________

程序源代码: main(){ int i,j,k,n;printf(“'water flower'number is:”);for(n=100;n<1000;n++){

i=n/100;/*分解出百位*/

j=n/10%10;/*分解出十位*/

k=n%10;/*分解出个位*/

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)

{

printf(“%-5d”,n);

} }

printf(“n”);}

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

__________________________________________________________________

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完

成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正

整数你n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

___________________________________________________________________

程序源代码:

/* zheng int is divided yinshu*/ main(){

int n,i;

printf(“nplease input a number:n”);

scanf(“%d”,&n);printf(“%d=”,n);for(i=2;i<=n;i++){

while(n!=i)

{

if(n%i==0)

{ printf(“%d*”,i);

n=n/i;

}

else

break;

} } printf(“%d”,n);}

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60

-89分之间的用B表示,60分以下的用C表示。

__________________________________________________________________

程序分析:(a>b)?a:b这是条件运算符的基本例子。

___________________________________________________________________

程序源代码: main(){

int score;char grade;

printf(“please input a scoren”);scanf(“%d”,&score);

grade=score>=90?'A'score>=60?'B':'C');printf(“%d belongs to %c”,score,grade);}

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

__________________________________________________________________

程序分析:利用辗除法。

___________________________________________________________________

程序源代码: main(){

int a,b,num1,num2,temp;

printf(“please input two numbers:n”);scanf(“%d,%d”,&num1,&num2);if(num1 { temp=num1;

num1=num2;

num2=temp;}

a=num1;b=num2;while(b!=0)/*利用辗除法,直到b为0为止*/ {

temp=a%b;

a=b;

b=temp;} printf(“gongyueshu:%dn”,a);printf(“gongbeishu:%dn”,num1*num2/a);}

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

__________________________________________________________________

程序分析:利用while语句,条件为输入的字符不为'n'.___________________________________________________________________

程序源代码: #include “stdio.h” main(){char c;int letters=0,space=0,digit=0,others=0;printf(“please input some charactersn”);while((c=getchar())!='n'){ if(c>='a'&&c<='z'||c>='A'&&c<='Z')

letters++;else if(c==' ')

space++;

else if(c>='0'&&c<='9')

digit++;

else

others++;}

printf(“all in all:char=%d space=%d digit=%d others=%

dn”,letters,space,digit,others);}

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如

2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

__________________________________________________________________

程序分析:关键是计算出每一项的值。

___________________________________________________________________

程序源代码: main(){

int a,n,count=1;long int sn=0,tn=0;

printf(“please input a and nn”);

scanf(“%d,%d”,&a,&n);printf(“a=%d,n=%dn”,a,n);while(count<=n){

tn=tn+a;

sn=sn+tn;

a=a*10;

++count;} printf(“a+aa+...=%ldn”,sn);}

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2

+3.编程找出1000以内的所有完数。

___________________________________________________________________

程序源代码: main(){ static int k[10];int i,j,n,s;for(j=2;j<1000;j++){ n=-1;s=j;

for(i=1;i

{

if((j%i)==0)

{ n++;

s=s-i;

k[n]=i;

}

} if(s==0){

printf(“%d is a wanshu”,j);for(i=0;i printf(“%d,”,k);printf(“%dn”,k[n]);} } }

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

___________________________________________________________________

程序源代码: main(){

float sn=100.0,hn=sn/2;int n;

for(n=2;n<=10;n++){

sn=sn+2*hn;/*第n次落地时共经过的米数*/

hn=hn/2;/*第n次反跳高度*/ }

printf(“the total of road is %fn”,sn);printf(“the tenth is %f metern”,hn);

}

题目:一只猴子摘了N个桃子第一天吃了一半又多吃了一个,第二天又吃了余下的

一半又多吃了一个,到第十天的时候发现还有一个.___________________________________________________________________

程序源代码:

/* 猴子吃桃问题 */ main(){

int i,s,n=1;for(i=1;i<10;i++){ s=(n+1)*2 n=s;} printf(“第一天共摘了%d个桃n”,s);}

迭代法求方程根

___________________________________________________________________

/* 迭代法求一个数的平方根 */ #define Epsilon 1.0E-6 /*控制解的精度*/ #include main(){

float a,x0,x1;

printf(“请输入要求的数:”);scanf(“%f”,&a);x0=a/2;

x1=(x0+a/x0)/2;

while(fabs(x1-x0)>=Epsilon)

{

x0=x1;

x1=(x0+a/x0)/2;

}

printf(“%f的平方根:%f.5n”,x1);}

/* 上题的另一种算法 */

#define Epsilon 1.0E-6 /*控制解的精度*/ #include #include main(){

float num,pre,this;do

{

scanf(“%f”,&num);/*输入要求平方根的数*/

}while(num<0);if(num==0)

printf(“the root is 0”);else

{

this=1;

do

{

pre=this;

this=(pre+num/pre)/2;

}while(fabs(pre-this)>Epsilon);/*用解的精度,控制循环次数*/

}

printf(“the root is %f”,this);}

用牛顿迭代法 求方程 2*x*x*x-4*x*x+3*x-6 的根 /* 牛顿迭代法 */ #define Epsilon 1.0E-6 /*控制解的精度*/ #include main(){

float x1,x0=1.5;

x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);

while(fabs(x1-x0>=Epsilon)

{

x0=x1;

x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);

}

printf(“方程的根为%fn”,x1);}

用二分法求上题 /* 二分法 */ #define Epsilon 1.0E-5 /*控制解的精度*/ #include

main(){

folat x1,x2,x0,f1,f2,f0;

x0=(x1+x2)/2;

f0=2*x0*x0*x0-4*x0*x0+3*x0-6;

/* 求中点的函数值 */

while(fabs(f0)>=Epsilon)

{

if(f0*f1<0)

{ x2=x0;

f2=2*x2*x2*x2-4*x2*x2+3*x2-6;

}

if(f0*f2<0)

{ x1=x0;

f1=2*x1*x1*x1-4*x1*x1+3*x1-6;

}

x0=(x1+x2)/2;

f0=2*x0*x0*x0-4*x0*x0+3*x0-6;

}

printf(“用二分法求得方程的根:%fn”,x0);}

题目:打印出如下图案(菱形)

* *** ****** ******** ****** *** *

___________________________________________________________________

程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利

用双重for循环,第一层控制行,第二层控制列。

___________________________________________________________________

程序源代码: main(){ int i,j,k;for(i=0;i<=3;i++){ for(j=0;j<=2-i;j++)

printf(“ ”);for(k=0;k<=2*i;k++)

printf(“*”);printf(“n”);} for(i=0;i<=2;i++){ for(j=0;j<=i;j++)

printf(“ ”);for(k=0;k<=4-2*i;k++)

printf(“*”);printf(“n”);} }

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

___________________________________________________________________

程序分析:同29例

___________________________________________________________________

程序源代码: main(){

long ge,shi,qian,wan,x;scanf(“%ld”,&x);wan=x/10000;

qian=x%10000/1000;shi=x%100/10;ge=x%10;

if(ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/ printf(“this number is a huiwenn”);else

printf(“this number is not a huiwenn”);}

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

___________________________________________________________________

程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语

句判断第二个字母。

___________________________________________________________________

程序源代码: #include void main(){ char letter;printf(“please input the first letter of somedayn”);while((letter=getch())!='Y')/*当所按字母为Y时才结束*/ { switch(letter){case 'S':printf(“please input second lettern”);

if((letter=getch())=='a')

printf(“saturdayn”);

else if((letter=getch())=='u')

printf(“sundayn”);

else printf(“data errorn”);

break;case 'F':printf(“fridayn”);break;case 'M':printf(“mondayn”);break;case 'T':printf(“please input second lettern”);

if((letter=getch())=='u')

printf(“tuesdayn”);

else if((letter=getch())=='h')

printf(“thursdayn”);

else printf(“data errorn”);

break;case 'W':printf(“wednesdayn”);break;default: printf(“data errorn”);

} } }

题目:Press any key to change color, do you want to try it.Please

hurry up!

___________________________________________________________________

程序源代码: #include void main(void){

int color;

for(color = 0;color < 8;color++){

textbackground(color);/*设置文本的背景颜色*/ cprintf(“This is color %drn”, color);cprintf(“ress any key to continuern”);getch();/*输入字符看不见*/ } }

题目:学习gotoxy()与clrscr()函数

___________________________________________________________________

程序源代码: #include void main(void){

clrscr();/*清屏函数*/ textbackground(2);gotoxy(1, 5);/*定位函数*/ cprintf(“Output at row 5 column 1n”);textbackground(3);gotoxy(20, 10);cprintf(“Output at row 10 column 20n”);}

题目:练习函数调用

___________________________________________________________________

程序源代码: #include void hello_world(void){ printf(“Hello, world!n”);} void three_hellos(void){ int counter;for(counter = 1;counter <= 3;counter++)hello_world();/*调用此函数*/ } void main(void){ three_hellos();/*调用此函数*/ }

题目:文本颜色设置

___________________________________________________________________

程序源代码: #include void main(void){

int color;

for(color = 1;color < 16;color++){

textcolor(color);/*设置文本颜色*/ cprintf(“This is color %drn”, color);}

textcolor(128 + 15);

cprintf(“This is blinkingrn”);}

题目:求100之内的素数

___________________________________________________________________

程序源代码: #include #include “math.h” #define N 101 main(){

int i,j,line,a[N];

for(i=2;i

if(a!=0&&a[j]!=0)

if(a[j]%a==0)

a[j]=0;} printf(“n”);for(i=2,line=0;i

题目:对10个数进行排序

___________________________________________________________________

程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个

元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。

程序源代码: #define N 10 main(){int i,j,min,tem,a[N];/*input data*/ printf(“please input ten num:n”);for(i=0;i

printf(“a[%d]=”,i);scanf(“%d”,&a);} printf(“n”);for(i=0;i

for(j=i+1;ja[j])min=j;tem=a;a=a[min];a[min]=tem;}

/*output data*/

printf(“After sorted n”);for(i=0;i

题目:求一个3*3矩阵对角线元素之和

___________________________________________________________________

程序分析:利用双重for循环控制输入二维数组,再将a累加后输出。

___________________________________________________________________

程序源代码:

main(){ float a[3][3],sum=0;int i,j;printf(“please input rectangle element:n”);for(i=0;i<3;i++)for(j=0;j<3;j++)scanf(“%f”,&a[j]);for(i=0;i<3;i++)sum=sum+a;printf(“duijiaoxian he is %6.2f”,sum);}

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数

组中。

___________________________________________________________________

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

___________________________________________________________________

程序源代码: main(){ int a[11]={1,4,6,9,13,16,19,28,40,100};int temp1,temp2,number,end,i,j;printf(“original array is:n”);for(i=0;i<10;i++)printf(“%5d”,a);printf(“n”);

printf(“insert a new number:”);scanf(“%d”,&number);end=a[9];

if(number>end)a[10]=number;else

{for(i=0;i<10;i++)

{ if(a>number)

{temp1=a;

a=number;

for(j=i+1;j<11;j++)

{temp2=a[j];

a[j]=temp1;

temp1=temp2;

}

break;

}

} }

for(i=0;i<11;i++)printf(“%6d”,a);}

题目:将一个数组逆序输出。

___________________________________________________________________

程序分析:用第一个与最后一个交换。

___________________________________________________________________

程序源代码: #define N 5 main(){ int a[N]={9,6,5,4,1},i,temp;printf(“n original array:n”);for(i=0;i

a=a[N-i-1];

a[N-i-1]=temp;} printf(“n sorted array:n”);for(i=0;i

题目:学习static定义静态变量的用法

___________________________________________________________________

程序源代码: #include “stdio.h” varfunc(){ int var=0;static int static_var=0;printf(“40:var equal %d n”,var);printf(“40:static var equal %d n”,static_var);printf(“n”);var++;

static_var++;}

void main(){int i;

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

varfunc();}

题目:学习使用auto定义变量的用法

___________________________________________________________________

程序源代码: #include “stdio.h” main(){int i,num;num=2;

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

{ printf(“40: The num equal %d n”,num);

num++;

{

auto int num=1;

printf(“40: The internal block num equal %d n”,num);

num++;

} } }

C语言的学基础,100个经典的算法-2 程序源代码: #include “stdio.h” main(){ int i,num;num=2;for(i=0;i<3;i++){ printf(“40: The num equal %d n”,num);num++;{ static int num=1;printf(“40:The internal block num equal %dn”,num);num++;} } }

题目:学习使用external的用法。

___________________________________________________________________

程序源代码: #include “stdio.h” int a,b,c;void add(){ int a;a=3;c=a+b;}

void main(){ a=b=4;add();

printf(“The value of c is equal to %dn”,c);}

题目:学习使用register定义变量的方法。

___________________________________________________________________

程序源代码: void main(){

register int i;int tmp=0;

for(i=1;i<=100;i++)tmp+=i;

printf(“The sum is %dn”,tmp);}

题目:宏#define命令练习(1)

___________________________________________________________________

程序源代码: #include “stdio.h” #define TRUE 1 #define FALSE 0 #define SQ(x)(x)*(x)void main(){ int num;int again=1;printf(“40: Program will stop if input value less than 50.n”);while(again){ printf(“40lease input number==>”);scanf(“%d”,&num);printf(“40:The square for this number is %d n”,SQ(num));if(num>=50)again=TRUE;else again=FALSE;} }

题目:宏#define命令练习(2)

___________________________________________________________________

程序源代码: #include “stdio.h” #define exchange(a,b){ /*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上“"*/ int t;t=a;a=b;b=t;}

void main(void){

int x=10;int y=20;

printf(”x=%d;y=%dn“,x,y);exchange(x,y);

printf(”x=%d;y=%dn“,x,y);}

题目:宏#define命令练习(3)

___________________________________________________________________

程序源代码: #define LAG > #define SMA < #define EQ == #include ”stdio.h“ void main(){ int i=10;int j=20;if(i LAG j)

printf(”40: %d larger than %d n“,i,j);else if(i EQ j)

printf(”40: %d equal to %d n“,i,j);else if(i SMA j)

printf(”40:%d smaller than %d n“,i,j);else

printf(”40: No such value.n“);}

题目:#if #ifdef和#ifndef的综合应用。

___________________________________________________________________

程序源代码: #include ”stdio.h“ #define MAX #define MAXIMUM(x,y)(x>y)?x:y #define MINIMUM(x,y)(x>y)?y:x void main(){ int a=10,b=20;#ifdef MAX printf(”40: The larger one is %dn“,MAXIMUM(a,b));#else printf(”40: The lower one is %dn“,MINIMUM(a,b));#endif #ifndef MIN printf(”40: The lower one is %dn“,MINIMUM(a,b));#else printf(”40: The larger one is %dn“,MAXIMUM(a,b));#endif #undef MAX #ifdef MAX printf(”40: The larger one is %dn“,MAXIMUM(a,b));#else printf(”40: The lower one is %dn“,MINIMUM(a,b));#endif #define MIN #ifndef MIN printf(”40: The lower one is %dn“,MINIMUM(a,b));#else

printf(”40: The larger one is %dn“,MAXIMUM(a,b));#endif }

题目:#include 的应用练习

___________________________________________________________________

程序源代码: test.h 文件如下: #define LAG > #define SMA < #define EQ ==

#include ”test.h“ /*一个新文件50.c,包含test.h*/ #include ”stdio.h“ void main(){ int i=10;int j=20;if(i LAG j)

printf(”40: %d larger than %d n“,i,j);else if(i EQ j)

printf(”40: %d equal to %d n“,i,j);else if(i SMA j)

printf(”40:%d smaller than %d n“,i,j);else

printf(”40: No such value.n“);}

题目:学习使用按位与 &。

___________________________________________________________________

程序分析:0&0=0;0&1=0;1&0=0;1&1=1

___________________________________________________________________

程序源代码: #include ”stdio.h“ main(){ int a,b;a=077;b=a&3;printf(”40: The a & b(decimal)is %d n“,b);b&=7;printf(”40: The a & b(decimal)is %d n“,b);}

题目:学习使用按位或 |。

___________________________________________________________________

程序分析:0|0=0;0|1=1;1|0=1;1|1=1

___________________________________________________________________

程序源代码: #include ”stdio.h“ main(){

int a,b;a=077;b=a|3;

printf(”40: The a & b(decimal)is %d n“,b);b|=7;

printf(”40: The a & b(decimal)is %d n“,b);}

题目:学习使用按位异或 ^。

___________________________________________________________________

程序分析:0^0=0;0^1=1;1^0=1;1^1=0

___________________________________________________________________

程序源代码: #include ”stdio.h“ main(){

int a,b;a=077;b=a^3;

printf(”40: The a & b(decimal)is %d n“,b);b^=7;

printf(”40: The a & b(decimal)is %d n“,b);}

题目:取一个整数a从右端开始的4~7位。

___________________________________________________________________

程序分析:可以这样考虑:

(1)先使a右移4位。

(2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4)(3)将上面二者进行&运算。

___________________________________________________________________

程序源代码: main(){ unsigned a,b,c,d;scanf(”%o“,&a);b=a>>4;c=~(~0<<4);d=b&c;printf(”%on%on“,a,d);}

题目:学习使用按位取反~。

___________________________________________________________________

程序分析:~0=1;~1=0;

___________________________________________________________________

程序源代码: #include ”stdio.h“ main(){

int a,b;a=234;b=~a;

printf(”40: The a's 1 complement(decimal)is %d n“,b);a=~a;

printf(”40: The a's 1 complement(hexidecimal)is %x n“,a);}

题目:画图,学用circle画圆形。

___________________________________________________________________

程序源代码: /*circle*/

#include ”graphics.h“ main(){

int driver,mode,i;float j=1,k=1;

driver=VGA;mode=VGAHI;initgraph(&driver,&mode,”“);setbkcolor(YELLOW);for(i=0;i<=25;i++)

{

setcolor(8);

circle(310,250,k);

k=k+j;

j=j+0.3;

} }

题目:画图,学用line画直线。

___________________________________________________________________

程序源代码:

#include ”graphics.h“ main(){ int driver,mode,i;float x0,y0,y1,x1;float j=12,k;driver=VGA;mode=VGAHI;initgraph(&driver,&mode,”“);setbkcolor(GREEN);x0=263;y0=263;y1=275;x1=275;for(i=0;i<=18;i++)

{

setcolor(5);

line(x0,y0,x0,y1);

x0=x0-5;

y0=y0-5;

x1=x1+5;

y1=y1+5;

j=j+10;

}

x0=263;y1=275;y0=263;for(i=0;i<=20;i++)

{

setcolor(5);

line(x0,y0,x0,y1);

x0=x0+5;

y0=y0+5;

y1=y1-5;

} }

题目:画图,学用rectangle画方形。

___________________________________________________________________

程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

___________________________________________________________________

程序源代码:

#include ”graphics.h“ main(){

int x0,y0,y1,x1,driver,mode,i;driver=VGA;mode=VGAHI;initgraph(&driver,&mode,”“);setbkcolor(YELLOW);

x0=263;y0=263;y1=275;x1=275;for(i=0;i<=18;i++)

{

setcolor(1);

rectangle(x0,y0,x1,y1);

x0=x0-5;

y0=y0-5;

x1=x1+5;

y1=y1+5;

} settextstyle(DEFAULT_FONT,HORIZ_DIR,2);outtextxy(150,40,”How beautiful it is!");line(130,60,480,60);setcolor(2);circle(269,269,137);}

第二篇:C语言常用算法归纳

C语言常用算法归纳

应当掌握的一般算法

一、基本算法:

交换、累加、累乘

二、非数值计算常用经典算法:

穷举、排序(冒泡,选择)、查找(顺序即线性)

三、数值计算常用经典算法:

级数计算(直接、简接即递推)、一元非线性方程求根(牛顿迭代法、二分法)、定积分计算(矩形法、梯形法)

四、其他:

迭代、进制转换、矩阵转置、字符处理(统计、数字串、字母大小写转换、加密等)、整数各数位上数字的获取、辗转相除法求最大公约数(最小公倍数)、求最值、判断素数(各种变形)、数组元素的插入(删除)、二维数组的其他典型问题(方阵的特点、杨辉三角形)

详细讲解

一、基本算法

1.交换(两量交换借助第三者)

1、任意读入两个整数,将二者的值交换后输出。main(){ int a,b,t;

scanf(“%d%d”,&a,&b);

printf(“%d,%dn”,a,b);t=a;a=b;b=t;

printf(“%d,%dn”,a,b);} 1 【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。

假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。其中t为中间变量,起到“空杯子”的作用。

注意:三句赋值语句赋值号左右的各量之间的关系!

【应用】

2、任意读入三个整数,然后按从小到大的顺序输出。main(){ int a,b,c,t;scanf(“%d%d%d”,&a,&b,&c);/*以下两个if语句使得a中存放的数最小*/ if(a>b){ t=a;a=b;b=t;} if(a>c){ t=a;a=c;c=t;} /*以下if语句使得b中存放的数次小*/ if(b>c){ t=b;b=c;c=t;} printf(“%d,%d,%dn”,a,b,c);} 2.累加

累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。

1、求1+2+3+……+100的和。main(){ int i,s;s=0;i=1;while(i<=100){ s=s+i;/*累加式*/

i=i+1;/*特殊的累加式*/

}

printf(“1+2+3+...+100=%dn”,s);} 【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。

3.累乘

累乘算法的要领是形如“s=s*A”的累乘式,此式必须出现在循环中才能被反复执行,从而实现累乘功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为1。

1、求10!

[分析] 10!=1×2×3×……×10

main(){ int i;long c;c=1;i=1;while(i<=10){ c=c*i;/*累乘式*/

i=i+1;} printf(“1*2*3*...*10=%ldn”,c);}

二、非数值计算常用经典算法

1.穷举

也称为“枚举法”,即将可能出现的每一种情况一一测试,判断是否满足条件,一般采用循环来实现。

1、用穷举法输出所有的水仙花数(即这样的三位正整数:其每位数位上的数字的立方和与该数相等,比如:1*1*1+5*5*5+3*3*3=153)。

[法一] main(){ int x,g,s,b;for(x=100;x<=999;x++){ g=x%10;s=x/10%10;b=x/100;

if(b*b*b+s*s*s+g*g*g==x)printf(“%dn”,x);} } 【解析】此方法是将100到999所有的三位正整数一一考察,即将每一个三位正整数的个位数、十位数、百位数一一求出(各数位上的数字的提取算法见下面的“数字处理”),算出三者的立方和,一旦与原数相等就输出。共考虑了900个三位正整数。

[法二] main(){int g,s,b;for(b=1;b<=9;b++)for(s=0;s<=9;s++)for(g=0;g<=9;g++)

if(b*b*b+s*s*s+g*g*g==b*100+s*10+g)printf(“%dn”,b*100+s*10+g);} 【解析】此方法是用1到9做百位数字、0到9做十位和个位数字,将组成的三位正整数与每一组的三个数的立方和进行比较,一旦相等就输出。共考虑了900个组合(外循环单独执行的次数为9,两个内循环单独执行的次数分别为10次,故if语句被执行的次数为9×10×10=900),即900个三位正整数。与法一判断的次数一样。

2.排序

(1)冒泡排序(起泡排序)

假设要对含有n个数的序列进行升序排列,冒泡排序算法步骤是:

①从存放序列的数组中的第一个元素开始到最后一个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置;

②第①趟结束后,最大数就存放到数组的最后一个元素里了,然后从第一个元素开始到倒数第二个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置;

③重复步骤①n-1趟,每趟比前一趟少比较一次,即可完成所求。例

1、任意读入10个整数,将其用冒泡法按升序排列后输出。#define n 10 main(){ int a[n],i,j,t;for(i=0;i

scanf(“%d”,&a[i]);for(j=1;j<=n-1;j++)

/*n个数处理n-1趟*/

for(i=0;i<=n-1-j;i++)/*每趟比前一趟少比较一次*/

if(a[i]>a[i+1]){ t=a[i];a[i]=a[i+1];a[i+1]=t;} for(i=0;i

(2)选择法排序

选择法排序是相对好理解的排序算法。假设要对含有n个数的序列进行升序排列,算法步骤是:

①从数组存放的n个数中找出最小数的下标(算法见下面的“求最值”),然后将最小数与第1个数交换位置;

②除第1个数以外,再从其余n-1个数中找出最小数(即n个数中的次小数)的下标,将此数与第2个数交换位置;

③重复步骤①n-1趟,即可完成所求。

1、任意读入10个整数,将其用选择法按升序排列后输出。#define n 10 main(){ int a[n],i,j,k,t;for(i=0;i

if(a[j] < a[k])k = j;

if(k!= i){ t = a[i];a[i] = a[k];a[k] = t;} } for(i=0;i

printf(“%dn”,a[i]);}

(3)插入法排序

要想很好地掌握此算法,先请了解“有序序列的插入算法”,就是将某数据插入到一个有序序列后,该序列仍然有序。插入算法参见下面的“数组元素的插入”。

1、将任意读入的整数x插入一升序数列后,数列仍按升序排列。#define n 10 main(){ int a[n]={-1,3,6,9,13,22,27,32,49},x,j,k;

/*注意留一个空间给待插数*/ scanf(“%d”,&x);if(x>a[n-2])a[n-1]=x;

/*比最后一个数还大就往最后一个元素中存放*/ else

/*查找待插位置*/

{ j=0;

while(j<=n-2 && x>a[j])j++;

for(k=n-2;k>=j;k--)/*从最后一个数开始直到待插位置上的数依次后移一位*/ a[k+1]=a[k];

a[j]=x;

/*插入待插数*/ }

for(j=0;j<=n-1;j++)printf(“%d ”,a[j]);} 插入法排序的要领就是每读入一个数立即插入到最终存放的数组中,每次插入都使得该数组有序。

2、任意读入10个整数,将其用插入法按降序排列后输出。(提示:将第2至第10个数一一有序插入到数组a中)#define n 10 main(){ int a[n],i,j,k,x;scanf(“%d”,&a[0]);/*读入第一个数,直接存到a[0]中*/ for(j=1;j

{ scanf(“%d”,&x);

if(x

else /*以下查找待插位置*/

{ i=0;

while(x

/*以下for循环从原最后一个数开始直到待插位置上的数依次后移一位*/

for(k=j-1;k>=i;k--)a[k+1]=a[k];

a[i]=x;/*插入待插数*/

}

} for(i=0;i

(4)归并排序

即将两个都升序(或降序)排列的数据序列合并成一个仍按原序排列的序列。

1、有一个含有6个数据的升序序列和一个含有4个数据的升序序列,将二者合并成一个含有10个数据的升序序列。

#define m 6 #define n 4 main(){ int a[m]={-3,6,19,26,68,100} ,b[n]={8,10,12,22};int i,j,k,c[m+n];i=j=k=0;while(i

/*将a、b数组中的较小数依次存放到c数组中*/ { if(a[i]

else {c[k]=b[j];j++;}

k++;} while(i>=m && j=n && i

(1)顺序查找(即线性查找)顺序查找的思路是:将待查找的量与数组中的每一个元素进行比较,若有一个元素与之相等则找到;若没有一个元素与之相等则找不到。

1、任意读入10个数存放到数组a中,然后读入待查找数值,存放到x中,判断a中有无与x等值的数。

#define N 10 main(){ int a[N],i,x;for(i=0;i

(2)折半查找(即二分法)

顺序查找的效率较低,当数据很多时,用二分法查找可以提高效率。使用二分法查找的前提是数列必须有序。

二分法查找的思路是:要查找的关键值同数组的中间一个元素比较,若相同则查找成功,结束;否则判别关键值落在数组的哪半部分,就在这半部分中按上述方法继续比较,直到找到或数组中没有这样的元素值为止。

1、任意读入一个整数x,在升序数组a中查找是否有与x等值的元素。#define n 10 main(){ int a[n]={2,4,7,9,12,25,36,50,77,90};int x,high,low,mid;/*x为关键值*/ scanf(“%d”,&x);high=n-1;low=0;mid=(high+low)/2;while(a[mid]!=x&&low

else low=mid+1;/*修改区间下界*/

mid=(high+low)/2;} if(x==a[mid])printf(“Found %d,%dn”,x,mid);else printf(“Not foundn”);}

三、数值计算常用经典算法

1.级数计算

级数计算的关键是“描述出通项”,而通项的描述法有两种:一为直接法、二为间接法又称递推法。

直接法的要领是:利用项次直接写出通项式;递推法的要领是:利用前一个(或多个)通项写出后一个通项。

可以用直接法描述通项的级数计算例子有:(1)1+2+3+4+5+……

(2)1+1/2+1/3+1/4+1/5+……等等。

可以用间接法描述通项的级数计算例子有:(1)1+1/2+2/3+3/5+5/8+8/13+……(2)1+1/2!+1/3!+1/4!+1/5!+……等等。(1)直接法求通项

1、求1+1/2+1/3+1/4+1/5+……+1/100的和。main(){ float s;int i;s=0.0;for(i=1;i<=100;i++)s=s+1.0/i;printf(“1+1/2+1/3+...+1/100=%fn”,s);} 【解析】程序中加粗部分就是利用项次i的倒数直接描述出每一项,并进行累加。注意:因为i是整数,故分子必须写成1.0的形式!

(2)间接法求通项(即递推法)

2、计算下列式子前20项的和:1+1/2+2/3+3/5+5/8+8/13+……。[分析]此题后项的分子是前项的分母,后项的分母是前项分子分母之和。main(){ float s,fz,fm,t,fz1;int i;s=1;/*先将第一项的值赋给累加器s*/ fz=1;fm=2;t=fz/fm;/*将待加的第二项存入t中*/ for(i=2;i<=20;i++){ s=s+t;

/*以下求下一项的分子分母*/

fz1=fz;/*将前项分子值保存到fz1中*/

fz=fm;/*后项分子等于前项分母*/

fm=fz1+fm;/*后项分母等于前项分子、分母之和*/ t=fz/fm;} printf(“1+1/2+2/3+...=%fn”,s);}

下面举一个通项的一部分用直接法描述,另一部分用递推法描述的级数计算的例子:

3、计算级#include float g(float x,float eps);main()

数的值,当通项的绝对值小于eps时计算停止。

{ float x,eps;scanf(“%f%f”,&x,&eps);printf(“n%f,%fn”,x,g(x,eps));} float g(float x,float eps){ int n=1;float s,t;s=1;t=1;do { t=t*x/(2*n);

s=s+(n*n+1)*t;/*加波浪线的部分为直接法描述部分,t为递推法描述部分*/

n++;}while(fabs(t)>eps);return s;} 2.一元非线性方程求根

(1)牛顿迭代法

牛顿迭代法又称牛顿切线法:先任意设定一个与真实的根接近的值x0作为第一次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,……如此继续下去,直到足够接近(比如|x-x0|<1e-6时)真正的根x*为止。

而f '(x0)=f(x0)/(x1-x0)所以 x1= x0-f(x0)/ f '(x0)

例如,用牛顿迭代法求下列方程在1.5附近的根:2x3-4x2+3x-6=0。#include “math.h” main(){ float x,x0,f,f1;x=1.5;do{ x0=x;

f=2*x0*x0*x0-4*x0*x0+3*x0-6;

f1=6*x0*x0-8*x0+3;

x=x0-f/f1;}while(fabs(x-x0)>=1e-5);printf(“%fn”,x);}

(2)二分法

算法要领是:先指定一个区间[x1, x2],如果函数f(x)在此区间是单调变化的,则可以根据f(x1)和 f(x2)是否同号来确定方程f(x)=0在区间[x1, x2]内是否有一个实根;如果f(x1)和 f(x2)同号,则f(x)在区间[x1, x2]内无实根,要重新改变x1和x2的值。当确定f(x)在区间[x1, x2]内有一个实根后,可采取二分法将[x1, x2]一分为二,再判断在哪一个小区间中有实根。如此不断进行下去,直到小区间足够小为止。

具体算法如下:

(1)输入x1和x2的值。(2)求f(x1)和f(x2)。

(3)如果f(x1)和f(x2)同号说明在[x1, x2] 内无实根,返回步骤(1),重新输入x1和x2的值;若f(x1)和f(x2)不同号,则在区间[x1, x2]内必有一个实根,执行步骤(4)。(4)求x1和x2的中点:x0=(x1+ x2)/2。(5)求f(x0)。

(6)判断f(x0)与f(x1)是否同号。

①如果同号,则应在[x0, x2]中寻找根,此时x1已不起作用,用x0代替x1,用f(x0)代替f(x1)。

②如果不同号,则应在[x1, x0]中寻找根,此时x2已不起作用,用x0代替x2,用f(x0)代替f(x2)。

(7)判断f(x0)的绝对值是否小于某一指定的值(例如10-5)。若不小于10-5,则返回步骤(4)重复执行步骤(4)、(5)、(6);否则执行步骤(8)。(8)输出x0的值,它就是所求出的近似根。

例如,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。#include “math.h” main(){ float x1,x2,x0,fx1,fx2,fx0;do { printf(“Enter x1&x2”);

scanf(“%f%f”,&x1,&x2);

fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;

fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;

}while(fx1*fx2>0);do { x0=(x1+x2)/2;

fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;

if((fx0*fx1)<0){ x2=x0;fx2=fx0;}

else {x1=x0;fx1=fx0;}

}while(fabs(fx0)>1e-5);printf(“%fn”,x0);} 3.梯形法计算定积分

定积分 的几何意义是求曲线y=f(x)、x=a、x=b以及x轴所围成的面积。

可以近似地把面积视为若干小的梯形面积之和。例如,把区间[a, b]分成n个长度相等的小区间,每个小区间的长度为h=(b-a)/n,第i个小梯形的面积为[f(a+(i-1)·h)+f(a+i·h)]·h/2,将n个小梯形面积加起来就得到定积分的近似值:

根据以上分析,给出“梯形法”求定积分的N-S结构图:

输入区间端点:a,b 输入等分数n h=(b-a)/2, s=0 i从1到n

si=(f(a+(i-1)*h)+f(a+i*h))*h/2 s=s+si 输出s 11 上述程序的几何意义比较明显,容易理解。但是其中存在重复计算,每次循环都要计算小梯形的上、下底。其实,前一个小梯形的下底就是后一个小梯形的上底,完全不必重复计算。为此做出如下改进:

矩形法求定积分则更简单,就是将等分出来的图形当作矩形,而不是梯形。例如:求定积分的值。等分数n=1000。

#include “math.h” float DJF(float a,float b){ float t,h;int n,i;float HSZ(float x);n=1000;h=fabs(a-b)/n;t=(HSZ(a)+HSZ(b))/2;for(i=1;i<=n-1;i++)t=t+HSZ(a+i*h);t=t*h;return(t);} float HSZ(float x){ return(x*x+3*x+2);} main(){ float y;y=DJF(0,4);

printf(“%fn”,y);}

四、其他常见算法

1.迭代法

其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。

例如,猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。编程求第一天共摘多少桃子。

main(){ int day,peach;peach=1;for(day=9;day>=1;day--)peach=(peach+1)*2;printf(“The first day:%dn”,peach);} 又如,用迭代法求x= 的根。

求平方根的迭代公式是:xn+1=0.5×(xn+a/ xn)[算法](1)设定一个初值x0。

(2)用上述公式求出下一个值x1。

(3)再将x1代入上述公式,求出下一个值x2。

(4)如此继续下去,直到前后两次求出的x值(xn+1和xn)满足以下关系: | xn+1-xn|<10-5 #include “math.h” main(){ float a,x0,x1;scanf(“%f”,&a);x0=a/2;x1=(x0+a/x0)/2;do{ x0=x1;

x1=(x0+a/x0)/2;

}while(fabs(x0-x1)>=1e-5);

printf(“%fn”,x1);} 2.进制转换

(1)十进制数转换为其他进制数 一个十进制正整数m转换成r进制数的思路是,将m不断除以r取余数,直到商为0时止,以反序输出余数序列即得到结果。

注意,转换得到的不是数值,而是数字字符串或数字串。

例如,任意读入一个十进制正整数,将其转换成二至十六任意进制的字符串。void tran(int m,int r,char str[],int *n){ char sb[]=“0123456789ABCDEF”;int i=0,g;do{ g=m%r;

str[i]=sb[g];

m=m/r;

i++;

}while(m!=0);*n=i;} main(){ int x,r0;/*r0为进制基数*/ int i,n;/*n中存放生成序列的元素个数*/

char a[50];

scanf(“%d%d”,&x,&r0);if(x>0&&r0>=2&&r0<=16){ tran(x,r0,a,&n);for(i=n-1;i>=0;i--)printf(“%c”,a[i]);

printf(“n”);} else exit(0);}(2)其他进制数转换为十进制数

其他进制整数转换为十进制整数的要领是:“按权展开”,例如,有二进制数101011,则其十进制形式为1×25+0×24+1×23+0×22+1×21+1×20=43。若r进制数an……a2a1(n位数)转换成十进制数,方法是an×r n-1+……a2×r1+a1×r0。

注意:其他进制数只能以字符串形式输入。

1、任意读入一个二至十六进制数(字符串),转换成十进制数后输出。

#include “string.h” #include “ctype.h” main(){ char x[20];int r,d;gets(x);/*输入一个r进制整数序列*/ scanf(“%d”,&r);/*输入待处理的进制基数2-16*/ d=Tran(x,r);printf(“%s=%dn”,x,d);} int Tran(char *p,int r){ int d,i,cr;char fh,c;d=0;fh=*p;if(fh=='-')p++;for(i=0;i

if(toupper(c)>='A')cr=toupper(c)-'A'+10;

else cr=c-'0';

d=d*r+cr;} if(fh=='-')d=-d;return(d);} 3.矩阵转置

矩阵转置的算法要领是:将一个m行n列矩阵(即m×n矩阵)的每一行转置成另一个n×m矩阵的相应列。

1、将以下2×3矩阵转置后输出。即将 1 2 3 转置成 1 4

6

main(){ int a[2][3],b[3][2],i,j,k=1;for(i=0;i<2;i++)

for(j=0;j<3;j++)

a[i][j]=k++;/*以下将a的每一行转存到b的每一列*/ for(i=0;i<2;i++)for(j=0;j<3;j++)

b[j][i]=a[i][j];for(i=0;i<3;i++)/*输出矩阵b*/ { for(j=0;j<2;j++)

printf(“%3d”,b[i][j]);

printf(“n”);} } 4.字符处理

(1)字符统计:对字符串中各种字符出现的次数的统计。典型例题:任意读入一个只含小写字母的字符串,统计其中每个字母的个数。#include “stdio.h ” main(){ char a[100];int n[26]={0};int i;/*定义26个计数器并置初值0*/ gets(a);for(i=0;a[i]!= '';i++)/*n[0]中存放‟a‟的个数,n[1] 中存放‟b‟的个数……*/

n[a[i]-'a' ]++;/*各字符的ASCII码值减‟a‟的ASCII码值,正好得对应计数器下标*/ for(i=0;i<26;i++)

if(n[i]!=0)printf(“%c :%dn ”, i+'a', n[i]);}(2)字符加密

例如、对任意一个只含有英文字母的字符串,将每一个字母用其后的第三个字母替代后输出(字母X后的第三个字母为A,字母Y后的第三个字母为B,字母Z后的第三个字母为C。)

#include “stdio.h” #include “string.h” main(){ char a[80]= “China”;int i;for(i=0;i='x'&&a[i]<='z'||a[i]>='X'&&a[i]<='Z')a[i]= a[i]-26+3;else a[i]= a[i]+3;puts(a);} 5.整数各数位上数字的获取

算法核心是利用“任何正整数整除10的余数即得该数个位上的数字”的特点,用循环从低位到高位依次取出整数的每一数位上的数字。

1、任意读入一个5位整数,输出其符号位及从高位到低位上的数字。main(){ long x;int w,q,b,s,g;scanf(“%ld”,&x);

if(x<0){printf(“-,”);x=-x;}

w=x/10000;/*求万位上的数字*/

q=x/1000%10;/*求千位上的数字*/ b=x/100%10;/*求百位上的数字*/ s=x/10%10;/*求十位上的数字*/ g=x%10;/*求个位上的数字*/

printf(“%d,%d,%d,%d,%dn”,w,q,b,s,g);} 例

2、任意读入一个整数,依次输出其符号位及从低位到高位上的数字。[分析]此题读入的整数不知道是几位数,但可以用以下示例的方法完成此题:

例如读入的整数为3796,存放在x中,执行x%10后得余数为6并输出;将x/10得379后赋值给x。再执行x%10后得余数为9并输出;将x/10得37后赋值给x……直到商x为0时终止。

main(){ long x;scanf(“%ld”,&x);if(x<0){printf(“-”);x=-x;} do { /*为了能正确处理0,要用do_while循环*/

printf(“%d ”, x%10);

x=x/10;

}while(x!=0);

printf(“n”);} 例

3、任意读入一个整数,依次输出其符号位及从高位到低位上的数字。

[分析]此题必须借助数组将依次求得的低位到高位的数字保存后,再逆序输出。main(){ long x;int a[20],i,j;scanf(“%ld”,&x);

if(x<0){ printf(“-”);x=-x;} i=0;do { a[i]=x%10;

x=x/10;i++;

}while(x!=0);

for(j=i-1;j>=0;j--)

printf(“%d ”,a[j]);printf(“n”);} 6.辗转相除法求两个正整数的最大公约数

该算法的要领是:假设两个正整数为a和b,先求出前者除以后者的余数,存放到变量r中,若r不为0,则将b的值得赋给a,将r的值得赋给b;再求出a除以b的余数,仍然存放到变量r中……如此反复,直至r为0时终止,此时b中存放的即为原来两数的最大公约数。

1、任意读入两个正整数,求出它们的最大公约数。[ 法一:用while循环时,最大公约数存放于b中] main(){ int a,b,r;do scanf(“%d%d”,&a,&b);while(a<=0||b<=0);/*确保a和b为正整数*/ r=a%b;while(r!=0){ a=b;b=r;r=a%b;} printf(“%dn”,b);} [ 法二:用do…while循环时,最大公约数存放于a中] main(){ int a,b,r;do scanf(“%d%d”,&a,&b);while(a<=0||b<=0);/*确保a和b为正整数*/ do {r=a%b;a=b;b=r;

}while(r!=0);printf(“%dn”,a);} 【引申】可以利用最大公约数求最小公倍数。提示:两个正整数a和b的最小公倍数=a×b/最大公约数。

2、任意读入两个正整数,求出它们的最小公倍数。[法一:利用最大公约数求最小公倍数] main(){ int a,b,r,x,y;do scanf(“%d%d”,&a,&b);while(a<=0||b<=0);/*确保a和b为正整数*/ x=a;y=b;/*保留a、b原来的值*/ r=a%b;while(r!=0){ a=b;b=r;r=a%b;} printf(“%dn”,x*y/b);} [法二:若其中一数的最小倍数也是另一数的倍数,该最小倍数即为所求] main(){ int a,b,r,i;do scanf(“%d%d”,&a,&b);while(a<=0||b<=0);/*确保a和b为正整数*/ i=1;while(a*i%b!=0)i++;printf(“%dn”,i*a);} 7.求最值 即求若干数据中的最大值(或最小值)。算法要领是:首先将若干数据存放于数组中,通常假设第一个元素即为最大值(或最小值),赋值给最终存放最大值(或最小值)的max(或min)变量中,然后将该量max(或min)的值与数组其余每一个元素进行比较,一旦比该量还大(或小),则将此元素的值赋给max(或min)……所有数如此比较完毕,即可求得最大值(或最小值)。

1、任意读入10个数,输出其中的最大值与最小值。#define N 10 main(){ int a[N],i,max,min;for(i=0;imax)max=a[i];else if(a[i]

素数又称质数,即“只能被1和自身整除的大于1的自然数”。判断素数的算法要领就是依据数学定义,即若该大于1的正整数不能被2至自身减1整除,就是素数。

1、任意读入一个正整数,判断其是否为素数。

main(){ int x,k;do scanf(“%d”,&x);while(x<=1);/*确保读入大于1的正整数*/ for(k=2;k<=x-1;k++)

if(x%k==0)break;/*一旦能被2~自身-1整除,就不可能是素数*/ if(k==x)printf(“%d is sushun”,x);else printf(“%d is not sushun”,x);} 以上例题可以用以下两种变形来解决(需要使用辅助判断的逻辑变量): 【变形一】将“2~自身-1”的范围缩小至“2~自身的一半” main(){ int x,k,flag;do scanf(“%d”,&x);while(x<=1);flag=1;/*先假设x就是素数*/ for(k=2;k<=x/2;k++)if(x%k==0){ flag=0;break;}/*一旦不可能是素数,即置flag为0*/ if(flag==1)printf(“%d is sushun”,x);else printf(“%d is not sushun”,x);} 【变形二】将“2~自身-1”的范围缩小至“2~自身的平方根” #include “math.h” main(){ int x,k,flag;do scanf(“%d”,&x);while(x<=1);flag=1;/*先假设x就是素数*/ for(k=2;k<=(int)sqrt(x);k++)

if(x%k==0){ flag=0;break;}/*一旦不可能是素数,即置flag为0*/ if(flag==1)printf(“%d is sushun”,x);else printf(“%d is not sushun”,x);} 例

2、用筛选法求得100以内的所有素数。

算法为:(1)定义一维数组a,其初值为:2,3,……,100;

(2)若a[k]不为0,则将该元素以后的所有a[k]的倍数的数组元素置为0;(3)a中不为0的元素,均为素数。#include #include main(){ int k,j,a[101];

clrscr();/*清屏函数*/

for(k=2;k<101;k++)a[k]=k;

for(k=2;k

for(j=k+1;j<101;j++)

if(a[k]!=0&&a[j]!=0)

if(a[j]%a[k]==0)a[j]=0;

for(k=2;k<101;k++)if(a[k]!=0)printf(“%5d”,a[k]);} 9.数组元素的插入、删除

(1)数组元素的插入

此算法一般是在已经有序的数组中再插入一个数据,使数组中的数列依然有序。算法要领是:

假设待插数据为x,数组a中数据为升序序列。

①先将x与a数组当前最后一个元素进行比较,若比最后一个元素还大,就将x放入其后一个元素中;否则进行以下步骤;

②先查找到待插位置。从数组a的第1个元素开始找到不比x小的第一个元素,设其下标为i ;

③将数组a中原最后一个元素至第i个元素依次一一后移一位,让出待插数据的位置,即下标为i的位置;

④将x存放到a(i)中。例题参见前面“„排序‟中插入法排序的例1”。(2)数组元素的删除

此算法的要领是:首先要找到(也可能找不到)待删除元素在数组中的位置(即下标),然后将待删元素后的每一个元素向前移动一位,最后将数组元素的个数减1。

1、数组a中有若干不同考试分数,任意读入一个分数,若与数组a中某一元素值相等,就将该元素删除。

#define N 6 main(){ int fs[N]={69,90,85,56,44,80},x;int i,j,n;n=N;scanf(“%d”,&x);/*任意读入一个分数值*/ /*以下查找待删分数的位置,即元素下标*/ for(i=0;i

(1)方阵的特点

行列相等的矩阵又称方阵。其两条对角线中“”方向的为主对角线,“/”方向的为副对角线。主对角线上各元素的下标特点为:行列值相等;副对角线上各元素的下标特点为:行列值之和都为阶数加1。

主对角线及其以下部分(行值大于列值)称为下三角。例

1、输出如下5阶方阵。1 2 2 2 2 3 1 2 2 2 3 3 1 2 2 3 3 3 1 2 3 3 3 3 1 #define N 5 main(){ int a[N][N],i,j;for(i=0;i

if(i==j)a[i][j]=1;

else if(i

else a[i][j]=3;for(i=0;i

printf(“%3d”,a[i][j]);printf(“n”);} } 例

2、输出如下5阶方阵。1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 #define N 5 main(){ int a[N][N],i,j;for(i=0;i

a[i][j]=i+j+1;/*沿副对角线平行线方向考察每个元素,其值等于行列值之和+1*/ for(i=0;i

printf(“%3d”,a[i][j]);

printf(“n”);} }(2)杨辉三角形

杨辉三角形的每一行是(x+y)n的展开式各项的系数。例如第一行是(x+y)0,其系数为1;第二行是(x+y)1,其系数为1,1;第三行是(x+y)2,其展开式为x2+2xy+y2,系数分别为1,2,1;……直观形式如下: 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ……

分析以上形式,可以发现其规律:是n阶方阵的下三角,第一列和主对角线均为1,其余各元素是它的上一行、同一列元素与上一行、前一列元素之和。

1、编程输出杨辉三角形的前10行。

#define N 10 main(){ int a[N][N],i,j;for(i=0;i

for(j=1;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=0;i

printf(“n”);

} } 例

2、以等腰三角形的形状输出杨辉三角形的前5行。1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 #define N 5 main(){ int a[N][N],i,j;for(i=0;i

a[i][0]=a[i][i]=1;for(i=0;i=0;j--)printf(“ ”);/*输出时每行前导空格递减*/

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

printf(“%4d”,a[i][j]);

printf(“n”);

} }

第三篇:程序员教你学C语言

程序员教你学C语言

很多小伙伴都老是会碰到疑问,其实还是基础没打扎实,这些题如果你不看答案你能知道多少呢?如果还有很多不知道就证明基础没打扎实,如果你还在入门纠结,如果你还在苦恼怎么入门!小编有个建议,可以加小编弄的一个C语言交流基地,大家可以进入交流基地:565122788,里面新手入门资料,可以说从零到项目实战,都是可以免费获取的,还有程序员大牛为各位免费解答问题,热心肠的小伙伴也是蛮多的。不失为是一个交流的的好地方,小编在这里邀请大家加入我的大家庭。欢迎你的到来。一起交流学习!共同进步!小编等你!还有前面没有看的同学最好从程序员教你学C语言

(一)开始看哦,尤其是基础还没打扎实的同学!

今天只举几个例子,主要帮大家巩固循环的知识,每个例子大家都要敲键盘敲出来,然后运行成功了才算掌握了,不然还是眼高手低,看上去懂了,一到写程序又犯难了。我发现有不少人热衷于打印图形,所以就弄了几个图形。第一个是打印金字塔。代码和运行图如下:

首先定义了两个变量i、j,然后使用system(“color 0e”)改变颜色。接下来会进入一个外层循环,其中的i代表层数,我们可以看到这里金字塔有6层,所以i的取值范围也是0<=i<6,第一次进循环时,i=0,然后到第一个内层循环,这个循环的初始条件是j=6-i=6,结束条件是j>0,所以这里会打印6个空格,然后来到第二个内层循环,这个循环的初始条件是j=1;结束条件是j<=2*i+1=1,所以这里会打印一个星,然后会以printf(“ ”)打印一个换行结束第一次外层循环,然后开始第二次外层循环,如此反复,最后就得到了如上所示的图形。

不理解的话可以把外层循环for(i = 0;i < 6;i++)的i<6改成i<3,这样就只会打印三行,可以便于理解。

第二个是打印菱形,其实就是上一个图形的变化,效果和代码如下:

可以看到,我们这个图形是上下对称的,所以打印菱形上半部分(就是上一个例子的打印金字塔)的代码和下半部分的代码十分相似,只是把外层循环的头部从for(i = 0;i < 6;i++)变成了for(i = 6;i >= 0;i--),大家理解一下代码,菱形的上半部分,打印的星星数会越来越多,从1到3再到5再到7...而星星前面的空格数会越来越少,从6到5再到4再到3...而菱形的下半部分刚好反过来了,所以只需要修改很少的代码就能实现菱形了

接下来是打印一个五角星,这是之前一个萌萌哒妹纸学习的代码,因为我比较懒啦,所以没做修改就直接拿来了,希望不要介意 #include #include void main(){ int n1,j1,k1;//n1表示行数,j1表示空格,k1表示*号 int n2,j2,k2;int n3,j3,k3;int n4,j4,k4;int a4,b4;system(“color 0e”);for(n1=1;n1<6;n1++)//1;n1<=6就是5行;n1++后+1 n1=2 { for(j1=1;j1<19-n1;j1++)//j1=1;j1<19-n1打印19-1=18个空格;j1++后+1 j1=2 printf(“ ”);for(k1=1;k1<=2*n1-1;k1++)//k1=1;k1<=2*n1-1打印2*1-1=1个*号;j1++后+1 j1=2 printf(“*”);printf(“ ”);} for(n2=1;n2<5;n2++){ for(j2=1;j2<3*n2-3;j2++)//j2=1;j2<3*n2-3;j2=3*1-3打印0个空格;j2++ printf(“ ”);for(k2=1;k2<=42-6*n2;k2++)//k2=1;k2<=42-6*n2;k2<=42-6*1打印36个*;k2++ printf(“*”);printf(“ ”);} for(n3=1;n3<3;n3++){ for(j3=1;j3<12-n3;j3++)printf(“ ”);for(k3=1;k3<=12+2*n3;k3++)printf(“*”);printf(“ ”);} for(n4=1;n4<5;n4++){ for(j4=1;j4<10-n4;j4++)printf(“ ”);for(k4=1;k4<=10-2*n4;k4++)printf(“*”);for(a4=1;a4<6*n4-3;a4++)printf(“ ”);for(b4=1;b4<10-2*n4;b4++)printf(“*”);printf(“ ”);} }

这个程序很明显分成了四块,由四个外层for循环构成,for(n1=1;n1<6;n1++)打印最上面5行,for(n2=1;n2<5;n2++)打印中间4行,for(n3=1;n3<3;n3++)打印下面2行行,for(n4=1;n4<5;n4++)打印最下面4行,大家自己理解下代码,不懂的就问

最后一个图形是我刚刚写的六芒星,完整的代码输出结果是这样的:

学习交流群(565122788)

但是我这里只给出一半代码,剩下的需要大家自己学完成,当是对自己的考验也好,作业也罢,还是希望大家能够自己亲自动手试一下的。不懂的就再问 #include #include void main(){ inti,j;system(“color 0e”);//输出第一行 for(j = 15;j >= 1;j--){ printf(“ ”);} printf(“* ”);//输出接下来四行 for(i = 1;i <= 4;i++){ for(j = 14;j >= i;j--){ printf(“ ”);} printf(“*”);for(j = 1;j < 2*i;j++){ printf(“ ”);} printf(“* ”);} //输出最长的一行 for(i = 1;i < 17;i++){ printf(“* ”);} printf(“ ”);//打印接下来四行 for(i = 0;i < 4;i++){ for(j = 0;j < i+1;j++){ printf(“ ”);} printf(“*”);for(j = 7;j > 2*i;j--){ printf(“ ”);} printf(“*”);for(j = 0;j < 2*i+11;j++){ printf(“ ”);} printf(“*”);for(j = 7;j > 2*i;j--){ printf(“ ”);} printf(“* ”);} //输出接下来一行,就2个星 printf(“ * * ”);} 这一半代码的输出结果是:

更多的数据类型和循环

前面我们说为了让计算机能够识别一个变量到底占了多少字节,我们需要为变量定义数据类型,那究竟有多少种数据类型呢,其实前面我给出32个关键字里面就已经包括了,short、int、long、char、float、double这6个关键字代表了C语言里的6中基本数据类型,怎么去理解它们呢,举个例子:大家都见过剪卡器吧?(没见过?手机卡总见过吧)。我们知道不同的手机使用的手机卡的大小是有区别的,我们通常是用剪卡器,拿着它把原来移动的大卡这么一咔,一个小卡就出来了,不同型号的剪卡器咔出来的手机卡大小不一样,比如苹果手机的卡就特别小,三星的卡稍微大点......,现在我们联想一下,short、int、long、char、float、double这六个东东是不是很像不同类型的剪卡器?拿着它们在内存上咔咔咔,不同大小的内存就分配好了。在32位的系统下short咔出来的内存大小是2个字节(也叫byte);int咔出来的内存大小是4个byte;long咔出来的内存大小是4个byte;float咔出来的内存大小是4个byte;double咔出来的内存大小是8个byte;char咔出来的内存大小是1个byte。接下来我们就写程序看看这些基本的数据类型在我们自己电脑上的大小吧。

其中sizeof关键字可以确定给定的类型占据了多少字节,它后面可以直接跟类型的关键字,比如sizeof(int),也可以跟变量(比如sizeof(i))甚至是表达式,比如最后一行的sizeof(i-1),它的结果是表达式的计算结果所占据的字节数,i-1的结果为0,0也是整数,所以占据的字节数为4。(注意这里是指的32位的编译环境下的情况,具体平台大家可以运行这个程序测试一下)。然后接下来是对这6种基本数据的使用情况

可以看到,两组都是同样的数据,但是最后打印出来的结果,上面一组数据中字符变量、浮点变量和双精度变量打印出来的结果都不对。原因是什么呢,因为是printf的第一个参数,%d这个符号,前面的%是占位符,后面的这个d代表是以整数形式打印出来,而不同的数据类型要以不同的形式打印出来,所以总结一下,%c表示打印字符、%f是打印浮点数、%lf是打印双精度,%hd、%d、%ld分别是打印短整型、整型和长整型

关于上面的字符c='a'为什么按%d整数打印是97的问题,这个其实就涉及到ascii码表了,我们知道在计算机底层,所有的数据都是以0和1存储的,那计算机如何识别像a、b、c这样的字符呢,其他它们最终在计算机里也是被以0、1数据的形式存放的,而且美国人就为它们指定了一个统一的标准,就是ascii编码,图片如下

可以看到小写字符a的ascii码值的十进制就是97,而大写A的ascii码是65,printf中的%d就是以十进制整数方式输出它在内存中的数据,所以就输出了97 接下来将大家使用这些基本数据类型最容易犯错的一点,就是极限值,我们知道计算机里的一位只能表示0或者1,而两位只能表示0、1、2、3,依次类推,我们如果有N位,那也只能表示2的N次方个数据,我们说int是4字节的,就是32位,所以int也是有极限值的,那是不是就是2的32次方呢,理论上来讲,它能表示这么多的数据,但是因为有正负数的存在,这个值还得减半,我们接下来的程序就是测试你机器上的这些基本类型的极限值的,注意unsigned这个修饰符就是无符号的数,比如unsigned int,这就是无符号整数,这样它能表示的范围就是0~4294967295(2的32次方-1)了。不小心极限值的话,就会经常犯错

C/C++学习交流群,欢迎大家一起来交流提升。565122788进群就能获取C语言新手学习大礼包

另外两种循环:while循环和do...while循环(还有一种可以构成循环的是goto,但是先不讲).while循环的格式: while(表达式){ 循环执行语句;} 下一条语句;while循环和for循环的区别在于它的循环头部没有赋初值的操作,一开始就会进行循环表达式的判断,如果表达式成立,则进入循环,否则跳到循环的下一条语句。看一个例子 # include void main(){ inti;printf(“please enter the right password ”);scanf(“%d”,&i);while(i!= 520){ printf(“please enter the right password ”);scanf(“%d”,&i);} printf(“right!good boy!”);} 程序一开始定义了整数变量i,然后提示用户输入密码,这时我们输入i的值,来到while(i!= 520)这句,i!= 520这句是如果i不等于520,就进入循环里面,并且提示密码输入错误,用户重新输入密码,再次输入密码后,会再次来到循环头部,如果i!= 520成立,会再次进入循环提示用户错误和重新输入,直到用户输入正确的数(也就是520)后i!= 520才不成立,就退出了循环。再来看看do while循环的格式: do { 循环执行语句;}while(表达式);循环下一句;do while和while的区别是它会首先执行一遍循环执行语句(所以do while最少都要执行一次),然后再循环尾部判断表达式是否成立,如果成立就继续进入循环,否则到达循环下一句。同样的例子 # include void main(){ inti;do { printf(“please enter the right password ”);scanf(“%d”,&i);}while(i!= 520);printf(“right!good boy!”);} 仔细对比它们的差异,假设我们第一次i的值就输入520,那么while循环里的循环执行语句就不会执行,但是do while还是会执行一次循环执行语句再在循环尾部判断表达式是否成立

第四篇:程序员C语言必背

Arithmeticoperator算术运算符 Logicaloperator逻辑运算符 function函数

Build-infunction内置函数

UserDefinedFunction自定义函数 prototype原型 void空值

Calledfunction被调函数 Callingfunction调用函数 return返回 scope作用域 auto自动变量

Register寄存器变量 extern外部变量

Formalparameter形式参数 Actualparameter实际参数 queue队列

Puts()把字符串数组输出到显示器 strlen()计算字符串的长度 strcpy()复制字符串 strcmp()字符串比较 strcat()字符串连接 struct定义结构 stack栈

Structuredprogramming结构化程序member成员

Assignmentoperator赋值运算符 Recursivefunction递归函数 Random随机数 power幂

Parameter参数

Parameterizedfunction参数化函数 Localvariable局部变量 Globalvariable全局变量 static静态变量

Callbyreference传值调用 Callbyvalue引用调用 String字符串

Stringliteral字符串常量 sequence序列

Gets()从标准键盘输入读入一个字符串string.h存放字符串函数的头文件

第五篇:C语言C++程序员编程必备

Java,NET,PHP,Ruby,Perl 和 Python 等,但今天我们要讨论的是两个最古老和流行的语言的C和C++。它们都有其特殊的地方,更有效的功能和支持的工具,这两种语言仍然很活跃。

今天我们整理了一些令人印象深刻的IDE(集成开发环境)和编译器推荐给 C 和 C++ 程序员。集成开发环境,主要用于提供软件应用的各种组件而开发的,其中最流行的功能是它们都有吸引力的用户界面。1)Best IDE for C/C++ – kDevelop KDevelop 是基于 KDevPlatform 的可使用开源插件扩展的 IDE。KDevPlatform 是一种可以用来作为 IDE 的基础库的开源集。

2)Best IDE for C/C++-Anjuta Anjuta Devstudio 具有先进的编程工具,包括项目管理,应用程序向导,交互式调试器,源代码编辑器,版本控制,GUI设计器,分析器和许多工具,另一个伟大的开发工作室。此工具提供的 C/C++ 程序员有很大强大的用户界面开发接口。

3)Best IDE for C/C++Eclipse CDT Eclipse CD 是最强大和最流行的IDE之一,提供了更高效的功能,如:项目的创建和管理,构建支持不同的工具链,标准make编译,源代码导航,各种来源的知识工具,代码编辑器,语法高亮,折叠和超链接导航,源代码重构和代码生成,可视化调试工具,包括内存,寄存器等等。

7)Best IDE for C/C++ – Compilr Compilr 是在线集成开发工具,让您与令人印象深刻的功能和简单的用户界面编写代码。该工具支持的编程语言中广泛的C,C + + JAVA,HTML等等。

8)Best IDE for C/C++Netbeans C++ Netbeans 的工具包括许多适合 C 和 C++ 项目类型模板,可以 使用动态库和静态创建 C/C++ 应用程序库。它拥有迷人的功能:代码协助,编译器配置,单元测试,源检查,远程开发和文件导航等等。

10)Best IDE/Compiler for C/C++Ultimate++ Ultimate++是对于 C++ 程序员来说是很好框架。这个 IDE 引入了模块化概念,可以结合 GCC,MinGW 和 Visual C++。

12)Best Compiler for C/C++-Digital Mars DigitalMars 是一款高性能的 C/C++ 编译器。包括的功能,如速度最快的编译/链接时,强

HTML文档,反汇编,图书管理员,资源编译器,make等,命令行和GUI版本,教程,代码示例,在线更新,标准模板库等等。

13)Best IDE for C-C-Free

14)Best Compiler for C/C++ – MinGW MinGW 编译器提供访问微软的C运行库和一些特定语言运行库的功能。

15)Best Compiler for C – Tiny C Compiler iny C Compiler 是最好的编译器之一,让开发人员可以在任何地方编译代码,可以使用任何 C 动态库,编译并直接执行C++源程序,也包含完整的 C 预处理器和 GNU 汇编器。

@扣丁学堂 智悦分享

下载100个超级经典的C语言算法,程序员必须练习word格式文档
下载100个超级经典的C语言算法,程序员必须练习.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    C语言测试:嵌入式程序员必须知道的16个问题

    C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,......

    C语言编程总结--程序员必须知道的77条编程细节(最终定稿)

    C语言编程总结--程序员必须知道的77条编程细节 分类: C语言学习心得体会 2010-08-08 19:33 63人阅读 评论 收藏 举报转载请注明出处:http://blog.csdn.net/ecorefeng 在......

    c语言编程练习

    本实验所有题目均要求使用指针。 1.写一函数,将一个3*3的整型矩阵转置。2.将两个按升序排列的数组合并成一个数组,并使合并后的数组也按升序排列。 要求: (1)输入两个数组(按升序);......

    嵌入式程序员C语言笔试题目

    华硕_嵌入式程序员C语言笔试题目 预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 6......

    嵌入式程序员C语言笔试经典题

    新一篇: 存储过程,无限级分类 | 旧一篇: 类继承中构造函数和析构函数的调用 这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好......

    29.如何学习C语言-----程序员之路

    作者:t5k5 日期:2007-10-24 一周没有写东西了,今天上校内的时候有个好友分享了这篇帖子,深有感触,以后坚决不用TC了,去下个VC++来学习C,哈哈~~还说我们用的教材太LJ了,这个我倒不......

    RSA加密解密算法C语言代码

    #include #include #include #include #include #include #define MAX 100 #define LEN sizeof(struct slink) void sub(int a[MAX],int b[MAX] ,int c[MAX] ); stru......

    黑马程序员c语言教程:Oracle简介

    9. 通过子查询建表 通过子查询建表的例子 SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date FROM s_emp WHERE dept_id = 41; SQL> CREATE TABLE A as......