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 {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