好文档 - 专业文书写作范文服务资料分享网站

(完整版)非常全的C语言常用算法

天下 分享 时间: 加入收藏 我要投稿 点赞

C语言常用算法

scanf(\

x0=a/2; x1=(x0+a/x0)/2; do{x0=x1;

x1=(x0+a/x0)/2;

}while(fabs(x0-x1)>=1e-5); printf(\}

2.进制转换

(1)十进制数转换为其他进制数

一个十进制正整数m转换成r进制数的思路是,将m不断除以r取余数,直到商为0时止,以反序输出余数序列即得到结果。

注意,转换得到的不是数值,而是数字字符串或数字串。

例如,任意读入一个十进制正整数,将其转换成二至十六任意进制的字符串。 void tran(int m,int r,char str[],int *n)

{char sb[]=\ int i=0,g; do{g=m%r; str[i]=sb[g]; m=m/r; i++;

}while(m!=0); *n=i; }

main()

{int x,r0; /*r0为进制基数*/

int i,n; /*n中存放生成序列的元素个数*/ char a[50];

scanf(\ if(x>0&&r0>=2&&r0<=16) {tran(x,r0,a,&n);

for(i=n-1;i>=0;i--) printf(\ printf(\ else exit(0); }

(2)其他进制数转换为十进制数

其他进制整数转换为十进制整数的要领是:“按权展开”,例如,有二进制数101011,则其十进制形式为1×25+0×24+1×23+0×22+1×21+1×20=43。若r进制数an……a2a1(n位数)转换成十进制数,方法是an×r n-1+……a2×r1+a1×r0。

注意:其他进制数只能以字符串形式输入。 例1、任意读入一个二至十六进制数(字符串),转换成十进制数后输出。 #include \#include \

C语言常用算法

main()

{char x[20]; int r,d;

gets(x); /*输入一个r进制整数序列*/ scanf(\ /*输入待处理的进制基数2-16*/ d=Tran(x,r);

printf(\}

int Tran(char *p,int r) {int d,i,cr; char fh,c; d=0; fh=*p; if(fh=='-')p++;

for(i=0;i

if(toupper(c)>='A') cr=toupper(c)-'A'+10; else cr=c-'0'; d=d*r+cr; }

if(fh=='-') d=-d; return(d); }

3.矩阵转置

矩阵转置的算法要领是:将一个m行n列矩阵(即m×n矩阵)的每一行转置成另一个n×m矩阵的相应列。

例1、将以下2×3矩阵转置后输出。

即将 1 2 3 转置成 1 4 4 5 6 2 5 3 6

main()

{int a[2][3],b[3][2],i,j,k=1; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=k++;

/*以下将a的每一行转存到b的每一列*/ for(i=0;i<2;i++) for(j=0;j<3;j++) b[j][i]=a[i][j];

for(i=0;i<3;i++) /*输出矩阵b*/ {for(j=0;j<2;j++)

printf(\ printf(\}

C语言常用算法

4.字符处理

(1)字符统计:对字符串中各种字符出现的次数的统计。

典型例题:任意读入一个只含小写字母的字符串,统计其中每个字母的个数。 #include \stdio.h \ main()

{char a[100]; int n[26]={0}; int i; /*定义26个计数器并置初值0*/ gets(a);

for(i=0;a[i]!= '\\0' ;i++) /*n[0]中存放’a’的个数,n[1] 中存放’b’的个数……*/

n[a[i]-'a' ]++; /*各字符的ASCII码值减去’a’的ASCII码值,正好得到对应计数器下标*/ for(i=0;i<26;i++)

if(n[i]!=0) printf(\%c :%d\\n \, i+'a', n[i]);

}

(2)字符加密

例如、对任意一个只含有英文字母的字符串,将每一个字母用其后的第三个字母替代后输出(字母X后的第三个字母为A,字母Y后的第三个字母为B,字母Z后的第三个字母为C。) #include \

#include \main()

{char a[80]= \; int i; 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、任意读入一个整数,依次输出其符号位及从低位到高位上的数字。 [分析]此题读入的整数不知道是几位数,但可以用以下示例的方法完成此题:

C语言常用算法

例如读入的整数为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); 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中]

C语言常用算法

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(\}

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

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

(完整版)非常全的C语言常用算法

C语言常用算法scanf(\x0=a/2;x1=(x0+a/x0)/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)>=1e-5);printf(\}2.进制转换(1)十进制数转换为其他进制数一个十进制正整数m转换
推荐度:
点击下载文档文档为doc格式
42aw81jqcf9uewu2s0h44x67j2pwjr01e7x
领取福利

微信扫码领取福利

微信扫码分享