C语言基础算法(2)
#include <stdio.h> #include <math.h> int main(){ float a,b,c,s,area; scanf("%f%f%f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) { s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("%.2f",area); }else { printf("False"); } return 0; }
- 从键盘任意输入a、b、c的值,编程计算并输出一元二次方程ax^2+bx+c=0的根。
#include <stdio.h> #include <math.h> int main(){ double a,b,c,disc,x1,x2,p,q; scanf("%lf%lf%lf",&a,&b,&c); disc=b*b-4*a*c; if(disc<0){ printf("无实根"); } else { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf("real roots:x1=%7.2f,x2=%7.2f",x1,x2); } return 0; }
- 从键盘输入任意年值,判此年是否为闰年。
#include <stdio.h> #include <math.h> int main(){ double a,b,c,disc,x1,x2,p,q; scanf("%lf%lf%lf",&a,&b,&c); disc=b*b-4*a*c; if(disc<0){ printf("无实根"); } else { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf("real roots:x1=%7.2f,x2=%7.2f",x1,x2); } return 0; }
- 输入成绩,若成绩>=90分,输出A;若成绩>=80分,输出B;若成绩>=70分,输出C;若成绩》=60分,输出D;若成绩<60分,输出E。
#include <stdio.h> int main(){ int score; scanf("%d",&score); switch(score/10) { case:10 case 9:printf("A\n");break; case 8:printf("B\n");break; case 7:printf("C\n");break; case 6:printf("D\n");break; case 5: case 4: case 3: case 2: case 1: case 0:printf("E\n");break; defailt:printf("The score not between 0 and 100!\n"); } return 0; }
二、循环
- 求阶乘(连乘)
#include <stdio.h> int main() { int i,n; double p=1; printf("输入一个整数,求其阶乘:"); scanf("%d",&n); for(i=1;i<=n;i++) p=p*i; printf("n!=%f\n",p); }
- 输出1!—n!(静态变量)
#include <stdio.h> long Func(int n); int main(){ int i,n; long result; scanf("%d",&n); for(i=1;i<=n;i++) printf("%d!=%ld\n",Func(i)); return 0; } long Func(int n) { static long p=1; p=p*n; return p; }
- 求n!(递归)
#include <stdio.h> int main(){ int n; long f; long fac(int n); scanf("%d",&n); f=fac(n); printf("%d!=%ld\n",n,f); return 0; } long fac(int n) { long f; if(n==1||n==0) f=1; else f=n*fac(n-1); return f; }
4、求和
( 1 )求给定项数之和 Sn= 1 + 2的平方 + 4 的平方 + 6的平方+...+50的平方
#include <stdio.h> int main() { int i,s=1; for(i=2;i<=50;i+=2) s=s+i*i; printf("s=%d\n",s); return 0; }
(2)正负符号相间的问题,循环次数依赖于项数值的大小。用π/4≈1-1/3+1/5-1/7+…求π的近似值,当某一项的绝对值<给定值为止。
#include <stdio.h> #include <math.h> int main(){ float j,n,t,pi; t=1.0; pi=0; n=1.0; j=1.0; while(fabs(t)>=1e-6){ pi=pi+t; n=n+2; j=-j; t=j/n; } pi=pi*4 printf("pi=%10.6f\n",pi); return 0; }
#include <stdio.h> int main(){ double x,p1=1,s=0; int i,j=1; scnaf("lf",&x); for(i=1;i<=10;i++){ p1*=x; p2*=i; s+=j*p1/p2; j=-j; } printf("s=%10.5f\n",s); return 0; }
#include <stdio.h> int mian(){ float i,j,n,m,pi; n=1.0; m=1.0 i=0.0; j=1.0; pi=0.0; while(n/m>=1e-6){ pi+n/m; i++; j=j+2; n=n*i; m=m*j; } printf("%f",pi*2); return 0; }
- 斐波那契数列:1,1,2,3,5,8,13,21…
(1)一个一个处理Fibonacci数列
#include <stdio.h> int main(){ int i,n; long a,b,next; a=b=1; printf("%10ld%10ld"a,b); n=2; for(i=3;i<=40;i++){ next=a+b; printf("%10ld",next); n++; if(n%6==0)printf("\n"); a=b; b=next; } return 0; }
(2)两个两个处理Fibonacci数列
#include <stdio.h> int main(){ int f1=1,f2=1; int i; for(i=1;i<20;i++){ printf("%12d %12d",f1,f2); if(i%2==0)printf("\n"); f1=f1+f2; f2=f2+f1; } return 0; }
(3)用数组处理Fibonacci数列
#include <stdio.h> int main(){ int i; int f[40]={1,1}; for(i=2;i<40;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<40;i++){ if(i%5==0)printf("\n"); printf("%12d",f[i]); } return 0; }
(4)用递归方法处理Fibonacci数列
#include <stdio.h> long fib(int n) { if(n<=2)return 1; else return fib(n-1)+fib(n-2); } int main(){ int i,a=1,n=1,m; printf("%12d%12d",a,b); m=2; for(i=3;i<40;i++){ printf("%12ld",fib(i)); m++; if(m%4==0)printf("\n"); } return 0; }
- 素数(只能被1和本身整除),一个大于3的整数n,判定它是否为素数。
(1)方法一
#include <stdio.h> #include <math.h> int main(){ int i,n; scanf("%d",&n); for(i=2;i<=n;i++) if(n%i==0)break; if(i>=n)printf("%d是素数\n",n); else printf("%d不是素数",n); }
(2)方法二
#include <stdio.h> #include <math.h> int int main(){ int i,n; scanf("%d",&n); int temp=(int)(sqrt(n));//方法三 n/2 for(i=2;i<=temp;i++) if(n%i==0)break; if(i>=n)printf("%d是素数\n",n); else printf("%d不是素数",n); }
(3)用函数判断一个数是否为素数
#include <stdio.h> int fun(int n); int main(){ int n; scanf("%d",&n); if(fun(n))printf("%d是素数\n",n); else printf("%d不是素数",n); } int fun(int n) { int i; for(i=2;i<n;i++) if(n%i==0)return 0; return 1; }
- break
编程:学校在1000名师生中发起慈善捐款,自愿捐款、款数不限、总数超过20000元活动结束。编写程序,统计参与捐款的师生人数及捐款总数(精确到角币,即保留1位小数)。
#include <stdio.h> #define M 20000 int main() { float x,sum=0; int i; for(i=1;i<=1000;i++){ scanf("%f",&x); sum=sum+x; if(sum>=M)break; } if(i>1000){ printf("捐款人数=%d,总捐款数=%.1f\n",i-1,sum); }else{ printf("捐款人数=%d,总捐款数=%.1f\n",i,sum); } return 0; }
- 利用辗转相除法求两个数的最大公约数和最小公倍数。
#include <stdio.h> int main(){ int a,b,r,m,n; scanf("%d,%d",&a,&b); m=a; n=b; if(a<b){ r=a; a=b; b=r; } while(b){ r=a%b; a=b; b=r; } printf("最大公约数为%d\n",a); printf("最小公倍数为%d\n",m*n/a); return 0; }
- 计数
输入若干等级制成绩(A、B、C、D、E等级),统计各等级人数,有效输入和无效输入次数,总人数。
#include <stdio.h> void main(){ char grade; int total=0,errTotal=0; int aCount=0,bCount=0,cCount=0,dCount=0,eCount=0; while((grade==getchar())!='\n'){ switch(grade) { case 'A': case 'a':++aCount;++total;break; case 'B': case 'b':++bCount;++total;break; case 'C': case 'c':++cCount;++total;break; case 'D': case 'd':++dCount;++total;break; case 'E': case 'e':++eCount;++tatal;break; default:printf("输入错误,请重新输入等级(A,B,C,D,E)\n"); ++errTotal;break; } } printf("总人数:%d A等:%d B等:%d C等:%d D等:%d E等:%d",total,aCount,bCount,cCount,dCount,eCount); }
- 完数
一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是完数。(1不是完数)。编程找出1000之内的所有完数。
#include <stdio.h> int main(){ int i,s,k; for(i=2;i<1000;i++){ s=0; for(k=1;k<i;k++) if(i%k==0)s=s+k; if(s==i)printf("%d",i); } return 0; }
12.同构数
一个数恰好等于它的平方数的右端,这个数称为同构数。如5的平方是25,5是25中的右端的数,5就是同构数。找出1~1000之间的全部同构数。
#include <stdio.h> int main(){ int i,k,t; for(i=1;i<=1000;i++){ t=i; k=i*i; while(t) { if(k%10!=t%10)break; else{ k=k/10; t=t/10; } } if(t==0) printf("%d %d\n",i,i*i); } return 0; }
- 把一个整数分成若干位并输出,水仙花数。
#include <stdio.h> int main(){ int i; long m1,m2,m3; for(i=100;i<=999;i++) { m1=i%10; m2=i/10%10; m3=i/100; if(m1*m1*m1+m2*m2*m2+m3*m3*m3==i) printf("%d\n",i); } return 0; }
-
构造数据
(1)2+22+222+…
#include <stdio.h> int main(){ int s=0,m=0,a,n,i; scanf("%d%d",&a,&n); for(i=1;i<=n;i++){ m=m*10+a; s=s+m; } printf("%d",s); return 0; }
(2)输出逆序数
#include <stdio.h> int main(){ int num,m=0; printf("输入一个整数"); scanf("%d",&num); do { m=m*10+num%10; num/=10; }while(num>0); printf("%d",m); return 0 }
15.回文
(1)判断一个整数是否为回文数。
回文数:整数与倒数一样。如12321就是一个回文数。
#include <stdio.h> int mian() { long x,a,b=0; scanf("%ld",&x); a=x; while(a!=0) { b=b*10+a%10; a=a/10; } if(x==b)printf("%ld:yes",x); else printf("%ld:no",x); return 0; }
(2)判断回文(字符串)
#include <stdio.h> #include <string.h> int fun(char *s) { char *p,*q; p=s; q=s+strlen(s)-1; for(;p<q;p++,q--) if(*p!=*q) return 0; return 1; } int main(){ char a[10]; gets(a); if(fun(a)) printf("%s:yes\n",a); else printf("%s:no",a); return 0; }
- 循环嵌套
(1)直角三角形
#include <stdio.h> int main(){ int i,j; for(i=1;i<=4;i++){ for(j=1;j<=i;j++) printf("*"); printf("\n"); } }
#include <stdio.h> int main(){ int i,j; for(i=1;i<=4;i++){ for(j=1;j<=5-i;j++) printf("*"); printf("\n"); } }
#include <stdio.h> int main(){ int i,j,k; for(i=1;i<=4;i++){ for(k=1;k<=i;k++) printf(" "); for(j=1;j<=5-i;j++) printf("*"); printf("\n"); } }
#include <stdio.h> int main() { int i, j, k; for (i = 1; i <= 4; i++) { for (k = 1; k <= 5-i; k++) printf(" "); for (j = 1; j <= i; j++) printf("*"); printf("\n"); } }
#include <stdio.h> int main() { int i, j, k; for (i = 1; i <= 4; i++) { for (k = 1; k <= 5-i; k++) printf(" "); for (j = 1; j <= 2*i-1; j++) printf("*"); printf("\n"); } }
#include <stdio.h> int main() { int i, j, k; for (i = 1; i <= 4; i++) { for (k = 1; k <= 5-i; k++) printf(" "); for (j = 1; j <= 2*i-1; j++) printf("*"); printf("\n"); } for (i = 3; i>=1; i--) { for (k = 1; k <= 5 - i; k++) printf(" "); for (j = 1; j <= 2 * i - 1; j++) printf("*"); printf("\n"); } }
- 数制转换
#include <stdio.h> int main(){ int x,rem[10],i=0,k; printf("输入一个十进制数"); scanf("%d",&x); while(x!=0){ rem[i]=x%2;//x%8 八进制 x=x/2; //x/8 八进制 } for(k=i,k>=0,k--){ printf("%d",rem[k]); } return 0; }
十六进制
#include <stdio.h> int main() { int x, rem[10], i = 0, k; printf("输入一个十进制数"); scanf("%d", &x); while (x != 0) { rem[i] = x % 16; x = x / 16; i++; } for (k = i - 1; k >= 0; k--) { if (rem[k] < 10) { printf("%d", rem[k]); } else { switch (rem[k]) { case 10:printf("%c", 'A'); break; case 11:printf("%c", 'B'); break; case 12:printf("%c", 'C'); break; case 13:printf("%c", 'D'); break; case 14:printf("%c", 'E'); break; case 15:printf("%c", 'F'); break; } } } return 0; }
三、数组、函数、结构体
- 输入十个数,输出其中最大数
#include <stdio.h> int main(){ int i,max,a[10]; for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=1;i<10;i++) if(a[i]>max) max=a[i]; printf("maxnumber=%d",max); return 0; }
- 求矩阵中最大元素值,以及其所在的行号和列号。
#include <stdio.h> int main(){ int i,j,row,colum,max; int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,5,2}}; max=a[0][0],row=0,colum=0; for(i=0;i<=2;i++) for(j=0;j<=3;j++) if(a[i][j]>max){ max=a[i][j]; row=i; colum=j; } printf("max=%d,row=%d,colum=%d\n",max,row,colum); return 0; }
- 选择排序
for(i=0;i<n-1;i++){ k=i; for(j=i+1;j<n;j++) if(a[j]<a[k]) k=j; x=a[i]; a[i]=a[k]; a[k]=x; }
for(i=0;i<n-1;i++){ for(j=0;j<n-i-1;j++){ if(a[j]<a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }
冒泡排序
4. 矩阵转置(不允许放到其他数组中)方阵
a[3][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) for(j=0;j<i;j++) a[i][j]=a[j][i];
- 杨辉三角
#include <stdio.h> int main() { int a[10][10],i,j; for(i=0;i<10;i++) { a[i][0]=1; a[i][i]=1; } for(i=2;i<10;i++){ for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; } for(i=0;i<10;i++) { for(j=0;j<=i;j++) printf(“%6d”,a[j][j]); printf('\n'); } return 0; }
- 逆序问题
(1)数值型数组逆序
for(i=0;i<n/2;i++) a[i]=a[n-i-1];
(2)字符串逆序
//方法一 #include <stdio.h> #include <string.h> int main(){ char a[10]; int i,j,k,t; gets(a); k=strlen(a)/2; j=strlen(a)-1; for(i=0;i<k;i++;j--) { t=a[i]; a[i]=a[j]; a[j]=t; } puts(a); return 0; } //方法二 #include <stdio.h> #include <string.h> int main(){ char a[10],*p,*q; gets(a); p=a; q=a+strlen(a)-1; for(;p<q;p++;q--) { t=*p; *p=*q; *q=t; } puts(a); return 0; } //方法三 #include <stdio.h> #include <string.h> void swap(int *arr,int n) { int t,i; for(i=0;i<n/2;i++){ t=arr[i]; arr[i]=arr[n-i-1]; arr[n-i-1]=t; } } int main(){ int a[10]={1,3,6,7,9,11,13,15,17,19},i,n; swap(a,10); for(i=0;i<10;i++) printf(%d,a[i]); return 0; }
- 四个函数
(1)实现字符串连接
#include <stdio.h> int main(){ void scat(char str1[],char str2[]); char s1[50],s2[50]; int i,k; printf("Input s1"); gets(s1); printf("Input s2"); gets(s2); scat(s1,s2); printf("Output s1:%s\n",s1); printf("Output s2:%s\n",s2); return 0; } void scat(char str1[],char str2[]) { int i=0,k=0; while(str[i]!='\0') i++; while(str2[k]!='\0') { str[i]=str2[k]; i++; k++; } str[i]='\0'; }
(2)字符串长度
#include <stdio.h> //递归 int strlength(char *a) { int b; if(*a=='\0') b=0; else b=1+strlength(a+1); return b; } //非递归: int strlength(char *p) { int k=0; while(*p!='\0') { k++; p++; } return k; } int main(){ char a[10]; int k=0; gets(a); k=strlength(a); printf("%d",k); return 0; }
- 字符串赋值-用字符指针编程
void MyStrcpy(char *dstStr,char *srcStr) { while(*srcStr!='\0'){ *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0'; }
4.用指针方式编写函数mystrcmp(char *,char *),实现字符串的比较。
#include <stdio.h> int mystrcmp(char *s,char *t) { while(*s==*t) { if(*s=='\0') return 0; s++; t++; } return (*s-*t); } int main() { char *pa="CHINA",b[10]="CANADA",*pb; pb=b; if(mystrcmp(pa,pb)>0) printf("%s>%s\n",pa,pb); else if(mystrcmp(pa,pb)==0) printf("%s=%s\n",pa,pb); else printf("%s<%s\n",pa,pb); }
- 结构体
(1)编写对候选人得票的统计程序。设有三个候选人,每次输入一个得票候选人的名字,要求最后输出各候选人的得票结果。
#include <stdio.h> #include <string.h> struct person{ char name[20]; int count; }leader[3]={{"li",0},{"zhang",0},{"wang",0}}; int main(){ int i,j; char leader_name[20]; for(i=1;i<=100;i++) { scanf("%s",leader_name); for(j=0;j<3j++) if(strcmp(leader_name,leader[i])) leader[i].count++; } for(i=0;i<3;i++) printf("%15s%5",leader[i].name,leader[i].count); return 0; }
-------转载 CSDN