C语言经典算法100例(一)

来源:互联网 发布:淘宝买小样靠谱店推荐 编辑:程序博客网 时间:2024/05/18 01:56
C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。

  接下来我们先来看10道:

  (1)输出9*9乘法口诀。

[cpp] view plaincopyprint?
  1. //9*9乘法口诀表 
  2. void Table99() 
  3.     int i,j; 
  4.     for(i = 1; i <= 9; i++)    //外层循环控制行 
  5.     {  
  6.         for(j = 1; j <= i; j++)//内层循环控制列 
  7.         { 
  8.             printf("%d*%d=%-4d",i,j,i*j); 
  9.         } 
  10.         printf("\n"); 
  11.     } 
//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....)这也是著名的斐波那契数列。

[cpp] view plaincopyprint?
  1. //斐波那契数列 
  2. void Fabocci() 
  3.     long int f1,f2; 
  4.     f1 = f2 = 1; 
  5.     int i; 
  6.     for(i = 1; i <= 20; i++) 
  7.     { 
  8.         printf("%12ld %12ld ",f1,f2); 
  9.         if(i % 2 == 0)     //控制输出,每行输出4个 
  10.             printf("\n"); 
  11.         f1 = f1+f2;       //后一个数是前两个数的和 
  12.         f2 = f1+f2;       //后一个数是前两个数的和 
  13.     } 
  14.  
//斐波那契数列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(这个数),如果能被整除,则表明此数不是素数,反之是素数。

[cpp] view plaincopyprint?
  1. //输出1-100的所有素数 
  2. void Prime() 
  3.     int i,j,flag,n; 
  4.     n = 100;   //100以内的素数 
  5.     flag = 1;  //标识变量,是素数则为1 
  6.  
  7.     for(i = 2; i <= 100; i++)  //从2开始,遍历到100 
  8.     { 
  9.         flag = 1; 
  10.         for(j = 2; j*j <= i; j++)//能被2 - sqrt(i)整除的数 
  11.         { 
  12.             if(i % j == 0) 
  13.             { 
  14.                 flag = 0; 
  15.                 break
  16.             } 
  17.         } 
  18.         if(flag == 1) 
  19.            printf("%d ",i);   //输出素数 
  20.     } 
//输出1-100的所有素数void Prime(){int i,j,flag,n;n = 100;   //100以内的素数flag = 1;  //标识变量,是素数则为1for(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以内的所有完数。

[cpp] view plaincopyprint?
  1. //找出1000以内的所有完数(一个数等于其因子之和) 
  2. void PerfectNumber() 
  3.     int p[80];  //保存分解的因子 
  4.     int i,num,count,s,c = 0; 
  5.     int MaxNum = 10000;  
  6.  
  7.     for(num = 2; num < MaxNum; num++) 
  8.     { 
  9.         count = 0; 
  10.         s = num; 
  11.         for(i = 1; i < num/2+1; i++)     //循环处理每个数 
  12.         { 
  13.             if(num % i == 0)         //能被i整除 
  14.             { 
  15.                 p[count++]  = i;      //保存因子,让计数器count增加1 
  16.                 s -= i;               //减去一个因子 
  17.             } 
  18.         } 
  19.         if( 0 == s) 
  20.         { 
  21.             printf("%4d是一个完数,因子是:",num); 
  22.             printf("%d = %d",num,p[0]); //输出完数 
  23.             for(i = 1; i < count; i++) 
  24.                 printf("+%d",p[i]); 
  25.             printf("\n"); 
  26.             c++; 
  27.         } 
  28.     } 
  29.     printf("\n共找到%d个完数。\n",c); 
//找出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增加1s -= 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列的方式输出。

[cpp] view plaincopyprint?
  1. void Array4_4() 
  2.     int A[4][4],B[4][4],i,j; 
  3.  
  4.     printf("Please Input 16 numbers:"); 
  5.     for(i = 0; i < 4; i++) 
  6.         for(j = 0; j < 4; j++) 
  7.         { 
  8.             scanf("%d",&A[i][j]); //输入16个数 
  9.             B[3-j][i] = A[i][j];   //旋转90度赋值 
  10.         } 
  11.     printf("Array A:\n");          //输出矩阵A 
  12.     for( i = 0; i < 4; i++) 
  13.     { 
  14.         for(j = 0 ; j < 4; j++) 
  15.         { 
  16.             printf("%4d",A[i][j]);       
  17.         } 
  18.         printf("\n"); 
  19.     } 
  20.     printf("Array B:\n");         //输出矩阵B 
  21.     for( i = 0; i < 4; i++) 
  22.     { 
  23.         for(j = 0 ; j < 4; j++) 
  24.         { 
  25.             printf("%4d",B[i][j]);       
  26.         } 
  27.         printf("\n"); 
  28.     } 
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");          //输出矩阵Afor( i = 0; i < 4; i++){for(j = 0 ; j < 4; j++){printf("%4d",A[i][j]);}printf("\n");}printf("Array B:\n");          //输出矩阵Bfor( i = 0; i < 4; i++){for(j = 0 ; j < 4; j++){printf("%4d",B[i][j]);}printf("\n");}}

运行结果:

(6)编程打印杨辉三角。

[cpp] view plaincopyprint?
  1. //打印杨辉三角 
  2. void YangHuiTriangle() 
  3.     int i,j,triangle[8][8]; 
  4.      
  5.     for(i = 0; i < 8; i++) 
  6.         for(j = 0; j < 8; j++) 
  7.             triangle[i][j] = 1; 
  8.  
  9.     for(i = 2; i < 8; i++) 
  10.     { 
  11.         for(j = 1; j < i; j++) 
  12.         {    
  13.             triangle[i][j] = triangle[i-1][j]+triangle[i-1][j-1]; 
  14.         } 
  15.     } 
  16.     for(i = 0; i < 8; i++) 
  17.     { 
  18.         for(j = 0; j <= i; j++) 
  19.             printf("%-4d",triangle[i][j]); 
  20.         printf("\n"); 
  21.     } 
  22.  
//打印杨辉三角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)实现将输入的字符串反序输出。

[cpp] view plaincopyprint?
  1. /*实现字符串翻转*/ 
  2. char* reverse_str(char* str) 
  3.     if(NULL == str) //字符串为空直接返回 
  4.     { 
  5.         return str; 
  6.     } 
  7.     char *begin; 
  8.     char *end; 
  9.     begin = end = str; 
  10.  
  11.     while(*end != '\0')//end指向字符串的末尾 
  12.     { 
  13.         end++; 
  14.     } 
  15.     --end; 
  16.  
  17.     char temp; 
  18.     while(begin < end) //交换两个字符 
  19.     { 
  20.         temp = *begin; 
  21.         *begin = *end; 
  22.         *end = temp; 
  23.         begin++; 
  24.         end--; 
  25.     } 
  26.  
  27.     return str; //返回结果 
/*实现字符串翻转*/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)

[cpp] view plaincopyprint?
  1. void strcopy(char *str,char *dest) 
  2.     while(*str != '\0'
  3.     { 
  4.         *dest++ = *str++; 
  5.     } 
  6.     *dest = '\0'
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+.....)

[cpp] view plaincopyprint?
  1. void Pi() 
  2.     double pi = 2,temp = 2;           //初始化pi值和临时值 
  3.     int numerator = 1,denominator = 3;//初始化分子和分母 
  4.  
  5.     while(temp > 1e-16)               //数列大于指定精度 
  6.     { 
  7.         temp = temp*numerator/denominator;//计算一个数列的值 
  8.         pi += temp; 
  9.         numerator++; 
  10.         denominator += 2; 
  11.     } 
  12.     printf("PI = %.18f\n",pi); 
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)输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。

[cpp] view plaincopyprint?
  1. //判断一个字符串是否是回文 
  2. void IsHuiWen() 
  3.     char str[100]; 
  4.     int i,j,n; 
  5.     printf("请输入一段字符串:"); 
  6.     gets(str); 
  7.     n = strlen(str); 
  8.     for(i = 0,j = n-1; i < j; i++,j--) 
  9.         if(str[i] != str[j]) 
  10.             break
  11.     if(i >= j) 
  12.         printf("是回文!\n"); 
  13.     else 
  14.         printf("不是回文!\n"); 
  15.  
//判断一个字符串是否是回文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");elseprintf("不是回文!\n");}

运行结果:


原创粉丝点击