当前位置:首页 > C语言常用而经典的算法
C语言常用算法
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(\}
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.整数各数位上数字的获取 C语言常用算法 算法核心是利用“任何正整数整除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); for(j=i-1;j>=0;j--) printf(\ \ printf(\} 6.辗转相除法求两个正整数的最大公约数 C语言常用算法 该算法的要领是:假设两个正整数为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(\} [法二:若其中一数的最小倍数也是另一数的倍数,该最小倍数即为所求] main() {int a,b,r,i; do scanf(\ while(a<=0||b<=0); /*确保a和b为正整数*/ i=1; while(a*i%b!=0) i++; C语言常用算法 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; 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(\
共分享92篇相关文档