非常全的C语言常用算法(3)

2018-12-27 16:27

C语言常用算法

for(i=0; i

if(a[i]>='x'&&a[i]<='z'||a[i]>='X'&&a[i]<='Z') a[i]= a[i]-26+3; else a[i]= a[i]+3;

puts(a);} 5.整数各数位上数字的获取

算法核心是利用“任何正整数整除10的余数即得该数个位上的数字”的特点,用循环从低位到高位依次取出整数的每一数位上的数字。

例1、任意读入一个5位整数,输出其符号位及从高位到低位上的数字。 main()

{long x; int w,q,b,s,g; scanf(\

if(x<0) {printf(\

w=x/10000; /*求万位上的数字*/ q=x/1000; /*求千位上的数字*/ b=x/100; /*求百位上的数字*/ s=x/10; /*求十位上的数字*/ g=x; /*求个位上的数字*/ printf(\

例2、任意读入一个整数,依次输出其符号位及从低位到高位上的数字。 [分析]此题读入的整数不知道是几位数,但可以用以下示例的方法完成此题:

例如读入的整数为3796,存放在x中,执行x后得余数为6并输出;将x/10得379后赋值给x。再执行x后得余数为9并输出;将x/10得37后赋值给x??直到商x为0时终止。

main()

{long x; scanf(\ if(x<0) {printf(\ \

do /*为了能正确处理0,要用do_while循环*/ {printf(\ \x); x=x/10; }while(x!=0); printf(\}

例3、任意读入一个整数,依次输出其符号位及从高位到低位上的数字。

[分析]此题必须借助数组将依次求得的低位到高位的数字保存后,再逆序输出。

main()

{long x; int a[20],i,j; scanf(\

if(x<0) {printf(\ \ i=0;

do {a[i]=x; x=x/10; i++; }while(x!=0);

C语言常用算法

for(j=i-1;j>=0;j--) printf(\ \ printf(\}

6.辗转相除法求两个正整数的最大公约数

该算法的要领是:假设两个正整数为a和b,先求出前者除以后者的余数,存放到变量r中,若r不为0,则将b的值得赋给a,将r的值得赋给b;再求出a除以b的余数,仍然存放到变量r中??如此反复,直至r为0时终止,此时b中存放的即为原来两数的最大公约数。 例1、任意读入两个正整数,求出它们的最大公约数。 [法一:用while循环时,最大公约数存放于b中]

main() {int a,b,r;

do scanf(\

while(a<=0||b<=0); /*确保a和b为正整数*/ r=a%b; while(r!=0)

{a=b;b=r;r=a%b;} printf(\}

[法二:用do…while循环时,最大公约数存放于a中]

main() {int a,b,r;

do scanf(\

while(a<=0||b<=0); /*确保a和b为正整数*/ do {r=a%b;a=b;b=r; }while(r!=0); printf(\}

【引申】可以利用最大公约数求最小公倍数。提示:两个正整数a和b的最小公倍数=a×b/最大公约数。 例2、任意读入两个正整数,求出它们的最小公倍数。 [法一:利用最大公约数求最小公倍数]

main()

{int a,b,r,x,y;

do scanf(\

while(a<=0||b<=0); /*确保a和b为正整数*/ x=a; y=b; /*保留a、b原来的值*/ r=a%b;

while(r!=0) {a=b;b=r;r=a%b;} printf(\}

[法二:若其中一数的最小倍数也是另一数的倍数,该最小倍数即为所求]

C语言常用算法

main() {int a,b,r,i;

do scanf(\

while(a<=0||b<=0); /*确保a和b为正整数*/ i=1;

while(a*i%b!=0) i++; printf(\} 7.求最值

即求若干数据中的最大值(或最小值)。算法要领是:首先将若干数据存放于数组中,通常假设第一个元素即为最大值(或最小值),赋值给最终存放最大值(或最小值)的max(或min)变量中,然后将该量max(或min)的值与数组其余每一个元素进行比较,一旦比该量还大(或小),则将此元素的值赋给max(或min)??所有数如此比较完毕,即可求得最大值(或最小值)。 例1、任意读入10个数,输出其中的最大值与最小值。

#define N 10 main()

{int a[N],i,max,min;

for(i=0;i

if(a[i]>max) max=a[i]; else if(a[i]

printf(\} 8.判断素数

素数又称质数,即“只能被1和自身整除的大于1的自然数”。判断素数的算法要领就是依据数学定义,即若该大于1的正整数不能被2至自身减1整除,就是素数。 例1、任意读入一个正整数,判断其是否为素数。

main() {int x,k;

do scanf(\

while(x<=1); /*确保读入大于1的正整数*/ for(k=2;k<=x-1;k++)

if(x%k==0)break; /*一旦能被2~自身-1整除,就不可能是素数*/ if(k==x) printf(\ else printf(\

以上例题可以用以下两种变形来解决(需要使用辅助判断的逻辑变量): 【变形一】将“2~自身-1”的范围缩小至“2~自身的一半”

main()

{int x,k,flag;

C语言常用算法

do scanf(\ while(x<=1); flag=1; /*先假设x就是素数*/ for(k=2;k<=x/2;k++)

if(x%k==0){flag=0; break;}/*一旦不可能是素数,即置flag为0*/ if(flag==1) printf(\ else printf(\

【变形二】将“2~自身-1”的范围缩小至“2~自身的平方根”

#include \main()

{int x,k,flag;

do scanf(\ while(x<=1); flag=1; /*先假设x就是素数*/ for(k=2;k<=(int)sqrt(x);k++)

if(x%k==0){flag=0; break;}/*一旦不可能是素数,即置flag为0*/ if(flag==1) printf(\ else printf(\例2、用筛选法求得100以内的所有素数。 算法为:(1)定义一维数组a,其初值为:2,3,??,100;

(2)若a[k]不为0,则将该元素以后的所有a[k]的倍数的数组元素置为0;

(3)a中不为0的元素,均为素数。

#include #include main( )

{int k,j,a[101]; clrscr(); /*清屏函数*/ for(k=2;k<101;k++)a[k]=k; for(k=2;k

} 9.数组元素的插入、删除

(1)数组元素的插入

此算法一般是在已经有序的数组中再插入一个数据,使数组中的数列依然有序。算法要领是: 假设待插数据为x,数组a中数据为升序序列。

①先将x与a数组当前最后一个元素进行比较,若比最后一个元素还大,就将x放入其后一个元素中;否则进行以下步骤;

②先查找到待插位置。从数组a的第1个元素开始找到不比x小的第一个元素,设其下标为i ; ③将数组a中原最后一个元素至第i个元素依次一一后移一位,让出待插数据的位置,即下标为i的位置;

C语言常用算法

④将x存放到a(i)中。 例题参见前面“‘排序’中插入法排序的例1”。

(2)数组元素的删除

此算法的要领是:首先要找到(也可能找不到)待删除元素在数组中的位置(即下标),然后将待删元素后的每一个元素向前移动一位,最后将数组元素的个数减1。

例1、数组a中有若干不同考试分数,任意读入一个分数,若与数组a中某一元素值相等,就将该元素删除。

#define N 6 main()

{int fs[N]={69,90,85,56,44,80},x; int i,j,n; n=N;

scanf(\任意读入一个分数值*/ /*以下查找待删分数的位置,即元素下标*/ for(i=0;i

if(i==n) printf(\

else /*将待删位置之后的所有元素一一前移*/ {for(j=i+1;j

for(i=0;i

(1)方阵的特点

行列相等的矩阵又称方阵。其两条对角线中“\\”方向的为主对角线,“/”方向的为副对角线。主对角线上各元素的下标特点为:行列值相等;副对角线上各元素的下标特点为:行列值之和都为阶数加1。

主对角线及其以下部分(行值大于列值)称为下三角。 例1、输出如下5阶方阵。 1 2 2 2 2 3 1 2 2 2 3 3 1 2 2 3 3 3 1 2 3 3 3 3 1

#define N 5 main()

{int a[N][N],i,j; for(i=0;i


非常全的C语言常用算法(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2015年会计继续教育公共类试卷答案97分

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: