10道C语言经典算法
0 2022-12-06

C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。

接下来我们先来看10道:

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

[cpp] view plain copy print?
//9*9乘法口诀表
void Table99()
{
int i,j;
for(i = 1; i {
for(j = 1; j {
printf("%d*%d=%-4d",i,j,i*j);
}
printf("\n");
}
}

运行结果:

(2)古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(兔子的规律为数列1,1,2,3,5,8,13,21....)这也是著名的斐波那契数列。

[cpp] view plain copy print?
//斐波那契数列
void Fabocci()
{
long int f1,f2;
f1 = f2 = 1;
int i;
for(i = 1; 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 plain copy print?
//输出1-100的所有素数
void Prime()
{
int i,j,flag,n;
n = 100; //100以内的素数
flag = 1; //标识变量,是素数则为1

for(i = 2; i {
flag = 1;
for(j = 2; j*j {
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ",i); //输出素数
}
}

关于一个数是否是素数,还有更高效的算法,大家可以先考虑一下,以后我会给出算法。

运行结果:

(4)一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1+2+3,找出10000以内的所有完数。

[cpp] view plain copy print?
//找出1000以内的所有完数(一个数等于其因子之和)
void PerfectNumber()
{
int p[80]; //保存分解的因子
int i,num,count,s,c = 0;
int MaxNum = 10000;

for(num = 2; num {
count = 0;
s = num;
for(i = 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 printf("+%d",p[i]);
printf("\n");
c++;
}
}
printf("\n共找到%d个完数。\n",c);
}

运行结果:

(5)下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出。

[cpp] view plain copy print?
void Array4_4()
{
int A[4][4],B[4][4],i,j;

printf("Please Input 16 numbers:");
for(i = 0; i for(j = 0; j {
scanf("%d",&A[i][j]); //输入16个数
B[3-j][i] = A[i][j]; //旋转90度赋值
}
printf("Array A:\n"); //输出矩阵A
for( i = 0; i {
for(j = 0 ; j {
printf("%4d",A[i][j]);
}
printf("\n");
}
printf("Array B:\n"); //输出矩阵B
for( i = 0; i {
for(j = 0 ; j {
printf("%4d",B[i][j]);
}
printf("\n");
}
}

运行结果:

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

[cpp] view plain copy print?
//打印杨辉三角
void YangHuiTriangle()
{
int i,j,triangle[8][8];

for(i = 0; i for(j = 0; j triangle[i][j] = 1;

for(i = 2; i {
for(j = 1; j {
triangle[i][j] = triangle[i-1][j]+triangle[i-1][j-1];
}
}
for(i = 0; i {
for(j = 0; j printf("%-4d",triangle[i][j]);
printf("\n");
}

}

运行结果:

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

[cpp] view plain copy print?
/*实现字符串翻转*/
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 {
temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}

return str; //返回结果
}

运行结果:

(8)实现字符串拷贝函数strcopy(char*src,char* dest)

[cpp] view plain copy print?
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 plain copy print?
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 plain copy print?
//判断一个字符串是否是回文
void IsHuiWen()
{
char str[100];
int i,j,n;
printf("请输入一段字符串:");
gets(str);
n = strlen(str);
for(i = 0,j = n-1; i if(str[i] != str[j])
break;
if(i >= j)
printf("是回文!\n");
else
printf("不是回文!\n");

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • 基于NI LabVIEW 2010和NI RIO构建精确定时的嵌入式系统

    1、介绍 在构建嵌入式系统时,不论是为了确保控制循环能够可靠的执行,还是保证I/O信号能够被及时响应,或是让处理速度达到系统应用的要求,定时都是其中的关键。构建一套可以满足定时要求的系统,首先从硬件开始进行选择,必须在尺寸、功耗、处理能力和延迟等方面进行很好的平衡。另外,嵌入式系统的软件在执行调节、中断响应和计算任务之间的时间平衡几个方面扮演着重要的角色。 在考虑定时性能的前提下进行嵌入式软硬件集...

    前天
  • 在NI LabVIEW中进行图形化编程的优势

    20多年来,NI LabVIEW被数百万名工程师和科学家用来开发繁复的测试、测量和控制应用程序。尽管LabVIEW提供从交互式助手到可配置式用户自定义界面的各种特性与工具,却通过图形化通用编程语言(所知的G)以及相关的集成化编译器、连接器和调试工具,显得与众不同。 运用高级编程的简史 为更深入理解LabVIEW图形化编程的主要价值定位,不妨对首类更高级编程语言的某些背景加以了解。当20世纪50年代...

    前天
  • 如何使用USRP-2921监测宽带频谱

    一、USRP简介 NI USRP-292X软件可编程无线收发器是专门为无线电通信教学和研究而开发的,作为学习RF和通信的教学方案,价位适中。美国国家仪器将NI LabVIEW软件和Ettus Research公司的硬件功能相结合,开发了这些价位适中的软件定义无线电(SDR)收发器,对通信教育、实验、研究和源代码快速开发起到了非常大的帮助作用。 USRP-2921硬件介绍: 图1 · 面向Wifi...

    前天
  • 开发模块化的软件架构

    概览 欢迎进入设计新一代测试系统的开发者指南。该指南汇总了一系列的技术白皮书,专为帮助您通过开发测试系统,降低成本、提升测试处理能力并顺应今后的需求。这份技术白皮书为选择最合适的软件应用开发环境(ADE),提供指导。下载完整的开发者指南(共120页),查阅ni.com/automatedtest/zhs 1、行业趋势和挑战 随着全球设计和新产品开发的快速发展,测试管理者和测试工程师在开发测试系统时...

    02-03
  • NI矢量信号收发器的FPGA编程

    1. 介绍 NI VST FPGA软件包含多层代码,提供了从底层控制到高层抽取的一切,拥有RF信号分析仪和RF信号发生器的功能。底层组件实现了具体硬件的标准功能,包括信号校准、前端控制,以及基于记录的采集和生成,被称为仪器设计库。这些库提供了互相匹配的主机和FPGA代码对,并且可以聚集以构建完整的硬件设计。LabVIEW项目样例包含了基于仪器设计库的相关主机和FPGA代码,提供了开发各种应用所需要...

    02-03
  • PIC 8位单片机汇编语言指令的组成

    各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。PIC8位单片机共有三个级别,有相对

    01-30
  • 从4个方面写出高效优美的单片机C语言代码

    [导读]程序能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看1,代码稳定,没有隐患。2,执行效率高。3,可读性高。4,便于移植。

    01-17
  • DAC0832波形图C语言程序

    [导读]#include#include#define uchar unsigned char#define uint unsigned int#define

    01-17
  • uCOS-II 初级程序员指南

    一、uC/OS-II简介uC/OS-II是一种基于优先级的可抢先的硬实时内核。自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内

    01-16
  • ST 几种库的代码效率如何?

    前言ST已经推出了三种库函数,用以方便客户快速开发STM32系列的MCU。从最早的标准外设驱动库,到后来的CubeHAL,再到CubeLL,还有直接写寄存器。这

    01-04
下载排行榜
更多
广告