c语言常见基本算法程序段
1、互换x,y的值
(1)利用中间变量t
t=x;x=y;y=t;
(2)自身相加减
x=x+y;y=x-y;x=x-y;
2、求m,n的最大公约数gys和最小公倍数gbs
(1)相除求余法:余数用r表示
if(m { 互换m,n的值 } gbs=m*n; /*为求最小公倍数*/ r=m%n; while(r!=0) {m=n; n=r; r=m%n; } gys=n; gbs=gbs/gys; (2)相减求差法:差数用c表示 if(m {互换m,n的值 } gbs=m*n; c=m-n; while(c!=0) {m=n; n=c; if(m {互换m,n的值 } c=m-n; } gys=m;/*或gys=n*/ gbs=gbs/gys; (3)穷举法 gbs=m*n; for(i=1;i<=n;i++) if(m%i==0&&n%i==0) gys=i; gbs=gbs/gys; (4)求多个整数的最大公约数和最小公倍数 方法一:穷举法 方法二:利用求余或相减法,先求其中前两个数的最大公约数,再用前两个数的最大公数与第三个数求最大公约数,以此类推,直到与最后一个数求最大公约数即可。 3、判断m是否是素数 (1)用标志变量flag=1假设m是素数 flag=1; for(i=2;i if(m%i= =0) {flag=0; break; } if(flag= =1) m是素数 else m不是素数 (2)用循环控制变量是否等于m for(i=2;i if(i= =m) m是素数 else m不是素数 4、累加累乘 注重发现累加项、累乘项的变化规律。(1)累加(或计数):累加器初始化为0 如求:1+2+3+.......+100 s=0; for(i=1;i<=100;i++) s=s+i; 或:s=0; i=1; while(i<=100) {s=s+i; i++; } (2)累乘:累乘器初始化为1 如求n! p=1; for(i=1;i<=n;i++) p=p*i 或:p=1; i=1; while(i<=n) {p=p*i; i++; } (3)累加累乘同时进行 如求:1!+2!+3!+.......+n! s=0; p=1; for(i=1;i<=n;i++) {p=p*i; s=s+p; } 或:s=0; p=1; i=1; while(i<=n) {p=p*i; s=s+p; i++; } 5、文本作图 a、外循环控制行,内循环控制列。 b、每次输出一个或一组文本。 c、注意文本前或文本与文本之间的空格个数。 d、定义行号,并找出行号与该行文本个数之间的关系。 (1)中心对称图形(行号:-n~~~n) * *** ***** ******* ***** *** * for(i=-n;i<=n;i++) {for(j=1;j<=abs(i)+m;j++) printf(““); for(j=1;j<=2*n+1-2*abs(i);j++) printf(“*”); printf(“\n”); } 或: 1 1 2 1 1 2 3 2 1 1 2 1 1 for(i=-2;i<=2;i++) {for(j=1;j<=3*abs(i);j++) printf(““); for(k=abs(i)-2;k<=2-abs(i);k++) printf(“%3d”,3-abs(i)-abs(k)); printf(“\n”) } (2)三角形 如:* ** *** **** for(i=1;i<=4;i++) {for(j=1;j<=i;j++) printf(“%c”,’*’); printf(“\n”); } 6、穷举与递推 (1)穷举:如果解决的问题可列出不定方程式或不定方程组,用不定方程中的未知数的作为循环控制变量,一个未知数一层循环,循环控制变量的初值、终值为未知数的取值范围。 如:百钱买百鸡。方程组如下: x+y+z=100 5*x+3*y+z/3.0=100 (2)、递推:根据前一项推出后一项或根据后一项推出前一项。递推时注意发现变化规律。 7、排序:(对数组a中的n个元素按升序排序) 从左向右排: (1)顺序比较 从左向右排: for(i=0;i for(j=i+1;j if(a[i]>a[j]) {x=a[i]; a[i]=a[j]; a[j]=x;} 从右向左排: for(i=n-1;i>0;i--) for(j=i-1;j>=0;j--) if(a[i]>a[j]) {x=a[i]; a[i]=a[j]; a[j]=x;} (2)选择排序 从左向右排: for(i=0;i {p=i; for(j=i+1;j if(a[p]>a[j]) p=j; if(p!=i) { x=a[p]; a[p]=a[i]; a[i]=x; } } 从右向左排: for(i=n-1;i>0;i--) {p=i; for(j=i-1;j>=0;j--) if(a[p]>a[j]) p=j; if(p!=i) {x=a[p]; a[p]=a[i]; a[i]=x;} } (3)冒泡排序 从左向右排: for(i=1;i for(j=0;j<=n-1-i;j++) if(a[j]>a[j+1]) {x=a[j]; a[j]=a[j+1]; a[j+1]=x; } 从右向左排: for(i=n-1;i>0;i--) { for(j=n-1;j>=n-i;j--) if(a[j] {x=a[j]; a[j]=a[j-1]; a[j-1]=x;} (4)插入排序 从左向右排: for(i=1;i<=n-1;i++) {x=a[i]; j=i-1; while(j>=0 && x {a[j+1]=a[j]; j=j-1; } a[j+1]=x; } 从右向左排: for(i=n-2;i>=0;i--) {x=a[i]; j=i+1; while(j<=n-1 && x>a[j]) {a[j-1]=a[j]; j=j+1; } a[j-1]=x; } 8、数组在统计中的应用 (1)、统计数组中符合要求的 如:输出数组a中大于平均值的元素,并统计个数。 #include Viod main() {int i,n=0,a[10]={34,56,76,23,12,87,32,45,38,41}; float aver,s=0; for(i=0;i<10;i++) s=s+a[i]; aver=s/10; for(i=0;i<10;i++) if(a[i]>aver) {n++; printf(“%d\t”,a[i]); } Printf(“\n%d”,n); } (2)、将统计的结果保存到数组中 如:统计全校1000名学生体重分别为48~52、53~57、58~62、63~67、68~72、73~77的人数。 #include void main() {int x , a[6]={0} , i ; for(i=1;i<=1000;i++) {scanf(“%d”,&x); a[(x-48)/5]++; } for(i=0;i<6;i++) printf(“%d~~%d:%d”,48+i*5,48+i*5+4 ,a[i]); } 9、极值(在给定的数组a中求最大值或最小值) 在数组中求极值时,可求极值,也可求极值的位置。假设数组中的首元素为最大值或最小值。 (1)、一维数组a[10] max=a[0];i1=0; min=a[0];i2=0; for(i=1;i<10;i++) {if(max if(min>a[i]) {min=a[i];i2=i;} } printf(“max=%d i1=%d\n”,max,i1); printf(“min=%d i2=%d\n”,min,i2); (2)、二维数组a[4][5] max=a[0][0];i1=0;j1=0; min=a[0][0];i2=0;j2=0; for(i=0;i<4;i++) for(j=0;j<5;j++)