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
C语言经典算法100例(一)的更多相关文章
- C语言经典算法100例
[程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...
- C语言经典算法100例(二)
11.判断某一年是否是闰年. //判断某一年份是否是闰年 int IsLeapYear(int year) { return (year % 400 == 0 || (year % 4 == 0) & ...
- C语言经典算法100例(三)
1.河内之塔 说明河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家 Edoua ...
- C语言经典程序100例
-------------------------------------------------------------------------------- [程序1] 题目:古典问题:有一对兔子 ...
- C语言经典例题100
C语言经典例题100 来源 http://www.fishc.com 适合初学者 ----------------------------------------------------------- ...
- C语言经典算法 - 多维矩阵转一维矩阵的代码
下边内容内容是关于C语言经典算法 - 多维矩阵转一维矩阵的内容,应该能对码农也有好处. #include <stdio.h>#include <stdlib.h>int mai ...
- C语言经典程序190例
[程序1] 题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数.求??代表的两位数,及809*??后的结果. 1.程序分析: 2.程序 ...
- JAVA 经典算法 40 例
[程序 1] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列 ...
- c语言经典算法---计算Fibonacci数列
算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.下面我就分享一个C语言中比较基础却极为重要的一个算法----计算Fi ...
随机推荐
- POJ 1166 The Clocks (爆搜 || 高斯消元)
题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...
- js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件
例如域名是 a.xx.com 和 b.xx.com 如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain. 如果iframe的时候 a包含b 为 ...
- svn 提交失败 更新失败 提示 已经锁定
出现问题的原因:在上传的时候,由于网络掉线,导致svn提交到一半就没有反应了,这个时候我点击了取消,再之后无论是进行 更新还是提交,都提示 已经锁定 解决方法:在项目的空白地方,点击SVN 清理 ...
- TS数据结构分析
1.TS包得数据结构 2. // Transport packet headertypedef struct TS_packet_header{ unsigned sync_byte ...
- request的用法
Request从几个集合取数据是有顺序的,从前到后的顺序依次是 QueryString,Form,最后是ServerVariables.Request对象按照这样的顺序依次搜索这几个集合中的变量,如果 ...
- 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(2)
安装和配置集群(Installing and Configuring your Cluster) 第一步是确保正确安装了 Java SE环境.ElasticSearch需要版本6或更高的版本,可以从下 ...
- 当rsync遇到非默认端口的ssh
在使用rsync使用ssh协议,来同步远程文件的方法,rsync -zvrtopg -e ssh但是如果遇到ssh不是22端口的时候使用rsync -zvrtopg -e ‘ssh -p 端口’特别是 ...
- 线性模型(3):Logistic Regression
此笔记源于台湾大学林轩田老师<机器学习基石><机器学习技法> (一)Logistic Regression 原理 对于分类问题,假设我们想得到的结果不是(x属于某一类)这种形式 ...
- bzoj 2132 圈地计划(黑白染色,最小割)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2132 [题意] 给定n*m个区域,建工业区价值A,建商业区价值B,如果(i,j)有k个 ...
- C++读取、旋转和保存bmp图像文件编程实现
以前也遇到过bmp文件的读写.这篇博客很好,写的其他内容也值得学习. 参考:http://blog.csdn.net/xiajun07061225/article/details/6633938 学 ...