算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。

一、计数、求和、求阶乘等简单算法

此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。

例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。

本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在x[10]。

void main()

{ int a[101],x[11],i,p;

for(i=0;i<=11;i++)

x[i]=0;

for(i=1;i<=100;i++)

{ a[i]=rand() % 100;

printf("M",a[i]);

if(i==0)printf("n");

}

for(i=1;i<=100;i++)

{ p=a[i];

if(p==0) p=10;

x[p]=x[p]+1;

}

for(i=1;i<=10;i++)

{ p=i;

if(i==10) p=0;

printf("%d,%dn",p,x[i]);

}

printf("n");

}

二、求两个整数的最大公约数、最小公倍数

分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)

(1) 对于已知两数m,n,使得m>n;

(2) m除以n得余数r;

(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);

(4) m←n,n←r,再重复执行(2)。

例如: 求 m=14 ,n=6 的最大公约数. m n r

14 6 2

6 2 0

void main()

{ int nm,r,n,m,t;

printf("please input two numbers:n");

scanf("%d,%d",&m,&n);

nm=n*m;

if (m

{ t=n; n=m; m=t; }

r=m%n;

while (r!=0)

{ m=n; n=r; r=m%n; }

printf("最大公约数:%dn",n);

printf("最小公倍数:%dn",nm/n);

}

三、判断素数

只能被1或本身整除的数称为素数

基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)

void main()

{ int m,i,k;

printf("please input a number:n");

scanf("%d",&m);

k=sqrt(m);

for(i=2;i

if(m%i==0) break;

if(i>=k)

printf("该数是素数");

else

printf("该数不是素数");

}

将其写成一函数,若为素数返回1,不是则返回0

int prime( m%)

{int i,k;

k=sqrt(m);

for(i=2;i

if(m%i==0) return 0;

return 1;

}

四、验证哥德巴赫猜想

(任意一个大于等于6的偶数都可以分解为两个素数之和)

基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2

再检验n1、n2是否素数,… 直到n1=n/2为止。

利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:

#include "math.h"

int prime(int m)

{ int i,k;

k=sqrt(m);

for(i=2;i

if(m%i==0) break;

if(i>=k)

return 1;

else

return 0;

}

main()

{ int x,i;

printf("please input a even number(>=6):n");

scanf("%d",&x);

if (x<6||x%2!=0)

printf("data error!n");

else

for(i=2;i<=x/2;i++)

if (prime(i)&&prime(x-i))

{

printf("%d+%dn",i,x-i);

printf("验证成功!");

break;

}

}

五、排序问题

1.选择法排序(升序)

基本思想:

1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;

2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;

3)依次类推,选择了n-1次后,这个数列已按升序排列。

程序代码如下:

void main()

{ int i,j,imin,s,a[10];

printf("n input 10 numbers:n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<9;i++)

{ imin=i;

for(j=i+1;j<10;j++)

if(a[imin]>a[j]) imin=j;

if(i!=imin)

{s=a[i]; a[i]=a[imin]; a[imin]=s; }

printf("%dn",a[i]);

}

}

2.冒泡法排序(升序)

基本思想:(将相邻两个数比较,小的调到前头)

1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;

2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;

3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。

程序段如下

void main()

{ int a[10];

int i,j,t;

printf("input 10 numbersn");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("n");

for(j=0;j<=8;j++)

for(i=0;i<9-j;i++)

if(a[i]>a[i+1])

{t=a[i];a[i]=a[i+1];a[i+1]=t;}

printf("the sorted numbers:n");

for(i=0;i<10;i++)

printf("%dn",a[i]);

}

3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)

基本思想:

1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;

2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;

3)将另一个数组剩余元素抄入C数组,合并排序完成。

程序段如下:

void main()

{ int a[10],b[10],c[20],i,ia,ib,ic;

printf("please input the first array:n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<10;i++)

scanf("%d",&b[i]);

printf("n");

ia=0;ib=0;ic=0;

while(ia<10&&ib<10)

{ if(a[ia]

{ c[ic]=a[ia];ia++;}

else

{ c[ic]=b[ib];ib++;}

ic++;

}

while(ia<=9)

{ c[ic]=a[ia];

ia++;ic++;

}

while(ib<=9)

{ c[ic]=b[ib];

b++;ic++;

}

for(i=0;i<20;i++)

printf("%dn",c[i]);

}

六、查找问题

1.①顺序查找法(在一列数中查找某数x)

基本思想:一列数放在数组a[1]---a[n]中,待查找的数放在x

中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;一旦x等于a[p]则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)

void main()

{ int a[10],p,x,i;

printf("please input the array:n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("please input the number you want find:n");

scanf("%d",&x);

printf("n");

p=0;

while(x!=a[p]&&p<10)

p++;

if(p>=10)

printf("the number is not found!n");

else

printf("the number is found the no%d!n",p);

}

思考:将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1

②基本思想:一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。(查找子过程如下。index:存放找到元素的下标。)

void main()

{ int a[10],index,x,i;

printf("please input the array:n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("please input the number you want find:n");

scanf("%d",&x);

printf("n");

index=-1;

for(i=0;i<10;i++)

if(x==a[i])

{ index=i; break;

}

if(index==-1)

printf("the number is not found!n");

else

printf("the number is found the no%d!n",index);

}

2.折半查找法(只能对有序数列进行查找)

基本思想:设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。用变量bot、top、mid

分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:

(1)x=a(mid),则已找到退出循环,否则进行下面的判断;

(2)x

(3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;

(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。

将上面的算法写成如下程序:

void main()

{

int a[10],mid,bot,top,x,i,find;

printf("please input the array:n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("please input the number you want find:n");

scanf("%d",&x);

printf("n");

bot=0;top=9;find=0;

while(bot

{ mid=(top+bot)/2;

if(x==a[mid])

{find=1;break;}

else if(x

c语言光显示算法,[转载]C语言常见算法相关推荐

  1. c il语言 定义变量,[转载]Skill语言入门

    第一章SKILL 语言基础 1.1 SKILL 语言简介 SKILL 是用于Cadence 软件二次开发的语言.我们关于SKILL 的介绍基于SKILL 语言参考档和Allegro SKILL的应用. ...

  2. c语言 指针溢出,[转载]C语言防止缓冲区溢出方法

    C语言使用直接的内存访问,缓冲区溢出是经常出现的安全问题. 下面将介绍常见的缓冲区溢出,及防止方法. 1.判断边界 例程序: void outstr(int a[10]) { for(i=0;a[i] ...

  3. c语言 函数运行时间,[转载]C语言获得函数的执行时间

    C语言获得函数的执行时间 1. 精确到秒,计时单位为秒 #include time_t start_time,end_time; start_time=time(NULL): end_time=tim ...

  4. 语言高精度算法阶乘_JavaScript中的算法(附10道面试常见算法题解决方法和思路)...

    https://juejin.im/post/6844903811505455118 Introduction 面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度.几乎毫无例外 ...

  5. python有哪些软件包用来考察变量之间的相关性_Python语言基础考察点:python语言基础常见考题(一)...

    一.python是静态还是动态类型?是强类型还是弱类型? 1.动态强类型语言(不少人误以为是弱类型) 不要傻傻分不清 2.动态还是静态指的是编译期还是运行期确定类型 3.强类型指的是不会发生隐式类型转 ...

  6. c语言分治法求众数重数_五大常见算法策略之——递归与分治策略

    递归与分治策略 递归与分治策略是五大常见算法策略之一,分治策略的思想就是 分而治之 ,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的 ...

  7. c语言调试时出现的三种错误,C语言课件 第十四章 常见错误和程序调试

    <C语言课件 第十四章 常见错误和程序调试>由会员分享,可在线阅读,更多相关<C语言课件 第十四章 常见错误和程序调试(36页珍藏版)>请在人人文库网上搜索. 1.第十四章常见 ...

  8. [转载]Java 语言中的函数编程

    Java 语言中的函数编程 如果您从事大型企业项目开发,您就会熟悉编写模块化代码的好处.良构的.模块化的代码更容易编写.调试.理解和重用.Java 开发人员的问题是,函数编程范型长期以来只是通过像 H ...

  9. golang 初始化并赋值_Go语言创建、初始化数组的常见方式汇总

    本文实例总结了Go语言创建.初始化数组的常见方式.分享给大家供大家参考.具体分析如下: Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式: //数组初始化的各种方式 func arraySl ...

最新文章

  1. C++标准库与STL简介
  2. HttpClient:绕开https证书(三)
  3. [NOTE] WindowsLinux常用环境变量
  4. 20155235 2016-2017-2《Java程序设计》课程总结
  5. 前端工作面试问题(下)
  6. 前后端交互json字符串
  7. Solr-5.3.1安装配置
  8. 网络游戏的客户端同步问题 .
  9. 10款Flash和Javascript网页音乐播放器
  10. MySQL半同步的配置
  11. oracle的aud文件,oracle asm实例的aud文件有关问题
  12. android 代码混淆原理,Android 代码混淆
  13. 电力、电气、电工知识汇总
  14. 计算机集成制造ppt英语,计算机集成制造cims
  15. html文件无法找到,html文件无法打开
  16. 即构CEO林友尧:让实时音视频技术融于无形
  17. r语言做断轴_R语言小作业-中级
  18. FTP(21) 文件传输协议
  19. 如何跳过前端JavaScript的验证
  20. 能独步天下吗?揭开至强E5处理器的最后面纱

热门文章

  1. 数据结构学习记录1——error: expected identifier before numeric constant未解决
  2. Flutter集成阿里百川SDK踩的坑
  3. 《Python编程快速上手》---项目记录(第12章)
  4. REDD Intelligence宣布高管任命
  5. 微信扫码支付成功后跳转
  6. Linux网络编程-很全面
  7. matlab中gad,10大经典算法matlab代码以及代码详解【数学建模、信号处理】
  8. FFmpeg解码内存G711A
  9. 小米公交卡智能卡重庆畅通卡退卡退款的方法
  10. python文件分类操作