C语言经典算法100例(一)
C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。
接下来我们先来看10道:
(1)输出9*9乘法口诀。
//9*9乘法口诀表 void Table99() { int i,j; for(i = 1; i <= 9; i++) //外层循环控制行 { for(j = 1; j <= i; j++) //内层循环控制列 { printf("%d*%d=%-4d",i,j,i*j); } printf("\n"); } }
运行结果:
(2)古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(兔子的规律为数列1,1,2,3,5,8,13,21....)这也是著名的斐波那契数列。
//斐波那契数列 void Fabocci() { long int f1,f2; f1 = f2 = 1; int i; for(i = 1; i <= 20; i++) { printf("%12ld %12ld ",f1,f2); if(i % 2 == 0) //控制输出,每行输出4个 printf("\n"); f1 = f1+f2; //后一个数是前两个数的和 f2 = f1+f2; //后一个数是前两个数的和 } }
运行结果:
(3)1-100之间有多少个素数,并输出所有素数及素数的个数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
//输出1-100的所有素数 void Prime() { int i,j,flag,n; n = 100; //100以内的素数 flag = 1; //标识变量,是素数则为1 for(i = 2; i <= 100; i++) //从2开始,遍历到100 { flag = 1; for(j = 2; j*j <= i; j++) //能被2 - sqrt(i)整除的数 { if(i % j == 0) { flag = 0; break; } } if(flag == 1) printf("%d ",i); //输出素数 } }
关于一个数是否是素数,还有更高效的算法,大家可以先考虑一下,以后我会给出算法。
运行结果:
(4)一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1+2+3
找出10000以内的所有完数。
//找出1000以内的所有完数(一个数等于其因子之和) void PerfectNumber() { int p[80]; //保存分解的因子 int i,num,count,s,c = 0; int MaxNum = 10000; for(num = 2; num < MaxNum; num++) { count = 0; s = num; for(i = 1; i < num/2+1; i++) //循环处理每个数 { if(num % i == 0) //能被i整除 { p[count++] = i; //保存因子,让计数器count增加1 s -= i; //减去一个因子 } } if( 0 == s) { printf("%4d是一个完数,因子是:",num); printf("%d = %d",num,p[0]); //输出完数 for(i = 1; i < count; i++) printf("+%d",p[i]); printf("\n"); c++; } } printf("\n共找到%d个完数。\n",c); }
运行结果:
(5)下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出。
void Array4_4() { int A[4][4],B[4][4],i,j; printf("Please Input 16 numbers:"); for(i = 0; i < 4; i++) for(j = 0; j < 4; j++) { scanf("%d",&A[i][j]); //输入16个数 B[3-j][i] = A[i][j]; //旋转90度赋值 } printf("Array A:\n"); //输出矩阵A for( i = 0; i < 4; i++) { for(j = 0 ; j < 4; j++) { printf("%4d",A[i][j]); } printf("\n"); } printf("Array B:\n"); //输出矩阵B for( i = 0; i < 4; i++) { for(j = 0 ; j < 4; j++) { printf("%4d",B[i][j]); } printf("\n"); } }
运行结果:
(6)编程打印杨辉三角。
//打印杨辉三角 void YangHuiTriangle() { int i,j,triangle[8][8]; for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) triangle[i][j] = 1; for(i = 2; i < 8; i++) { for(j = 1; j < i; j++) { triangle[i][j] = triangle[i-1][j]+triangle[i-1][j-1]; } } for(i = 0; i < 8; i++) { for(j = 0; j <= i; j++) printf("%-4d",triangle[i][j]); printf("\n"); } }
运行结果:
(7)实现将输入的字符串反序输出。
/*实现字符串翻转*/ char* reverse_str(char* str) { if(NULL == str) //字符串为空直接返回 { return str; } char *begin; char *end; begin = end = str; while(*end != '\0') //end指向字符串的末尾 { end++; } --end; char temp; while(begin < end) //交换两个字符 { temp = *begin; *begin = *end; *end = temp; begin++; end--; } return str; //返回结果 }
运行结果:
(8)实现字符串拷贝函数strcopy(char*src,char* dest)
void strcopy(char *str, char *dest) { while(*str != '\0') { *dest++ = *str++; } *dest = '\0'; }
(9)求近似Pi值。可以用公式(如:pi/2 = 1+1/3+1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9+.....)
void Pi() { double pi = 2,temp = 2; //初始化pi值和临时值 int numerator = 1,denominator = 3; //初始化分子和分母 while(temp > 1e-16) //数列大于指定精度 { temp = temp*numerator/denominator;//计算一个数列的值 pi += temp; numerator++; denominator += 2; } printf("PI = %.18f\n",pi); }
这里求得的只是近似的值,精度不高,对于求任意位的pi值就无能无力了,大家可以考虑如何求任意位数的pi值,
关于任意位数的pi值求法,可以参见我的博客:《计算任意位数的Pi》
运行结果:
(10)输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。
//判断一个字符串是否是回文 void IsHuiWen() { char str[100]; int i,j,n; printf("请输入一段字符串:"); gets(str); n = strlen(str); for(i = 0,j = n-1; i < j; i++,j--) if(str[i] != str[j]) break; if(i >= j) printf("是回文!\n"); else printf("不是回文!\n"); }
运行结果:
转载请标明出处:http://blog.csdn.net/u012027907/article/details/12624829