zoukankan      html  css  js  c++  java
  • 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("
    ");
    	}
    }

    运行结果:

    (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("
    ");
    		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("
    ");
    			c++;
    		}
    	}
    	printf("
    共找到%d个完数。
    ",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:
    ");          //输出矩阵A
    	for( i = 0; i < 4; i++)
    	{
    		for(j = 0 ; j < 4; j++)
    		{
    			printf("%4d",A[i][j]);		
    		}
    		printf("
    ");
    	}
    	printf("Array B:
    ");          //输出矩阵B
    	for( i = 0; i < 4; i++)
    	{
    		for(j = 0 ; j < 4; j++)
    		{
    			printf("%4d",B[i][j]);		
    		}
    		printf("
    ");
    	}
    }

    运行结果:

    (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("
    ");
    	}
    
    }

    运行结果:


    (7)实现将输入的字符串反序输出。

    /*实现字符串翻转*/
    char* reverse_str(char* str)
    {
    	if(NULL == str) //字符串为空直接返回
    	{
    		return str;
    	}
    	char *begin;
    	char *end;
    	begin = end = str;
    
    	while(*end != '') //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 != '')
    	{
    		*dest++ = *str++;
    	}
    	*dest = '';
    }

    (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
    ",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("是回文!
    ");
    	else
    		printf("不是回文!
    ");
    
    }

    运行结果:


    转载请标明出处:http://blog.csdn.net/u012027907/article/details/12624829

  • 相关阅读:
    微软警告:“大规模电子邮件活动”正在推动勒索软件感染
    静态莫队分块
    可持久化线段树练习题
    KMP的一些好题
    KMP模式匹配
    最大异或路径
    人类分块精华(Ex)
    人类分块精华(二)
    人类分块精华(一)
    Treap 详解
  • 原文地址:https://www.cnblogs.com/riskyer/p/3364713.html
Copyright © 2011-2022 走看看