(1)求方程ax^2+bx+0的解
方程有解有以下几种可能:
1.b^2-4ac=0,方程有两个相等实根。
2.b^2-4ac>0,方程有两个不等实根。
3.b^2-4ac<0,方程有两个共轭复根。
程序中需要判断b^2-4ac是否等于0,由于它是实数,在存储时会有一些微笑的误差,因此不能直接进行(b*b-4ac)==0的判断。因为这样可能会出现本来是0的量,由于上述误差被判断不等于0而导致错误的结果。所以采取的办法是判别其绝对值是否小于一个很小的数(例如10^-6),如果小于此数,就认为它等于0.
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 double a,b,c,disc,x1,x2,realpart,imagpart; 6 scanf("%lf,%lf,%lf",&a,&b,&c);//输入三个数据时用逗号作为分隔符 7 disc=b*b-4*a*c; 8 if(fabs(disc)<=1e-6) 9 printf("has two equal roots:%8.4lf\n",-b/(2*a)); 10 else if(disc>1e-6){ 11 x1=(-b+sqrt(disc))/(2*a); 12 x2=(-b+sqrt(disc))/(2*a); 13 printf("has distinct real roots:%8.4lf\n",-b/(2*a)); 14 } 15 else{ 16 realpart=-b/(2*a); 17 imagpart=sqrt(-disc)/(2*a); 18 printf("has complex roots:\n"); 19 printf("%8.4lf+%8.4lf i \n",realpart,imagpart); 20 printf("%8.4lf+%8.4lf i \n",realpart,imagpart); 21 } 22 return 0; 23 }
(2)从键盘输入年号和月号,试计算改年该月共有几天:
1 #include<stdio.h> 2 3 int main(){ 4 int year,month,days=0; 5 printf("please input year and month:(use \‘,\‘ to distinct)\n"); 6 scanf("%d,%d",&year,&month); 7 8 switch(month){ 9 case 1: 10 case 3: 11 case 5: 12 case 7: 13 case 8: 14 case 10: 15 case 12:days=31;break; 16 case 4: 17 case 6: 18 case 9: 19 case 11:days=30;break; 20 case 2: 21 if(year%4==0&&year%100!=0||year%400==0) 22 days=29; 23 else 24 days=28; 25 break; 26 default: 27 printf("Data error!"); 28 } 29 printf("%d年%d月有%d天\n",year,month,days); 30 return 0; 31 }
(3)输入今天的日期y(年),m(月),d(日),输出明天的日期:
1 #include<stdio.h> 2 3 //验证输入值是否正确的函数 4 int valid(int y,int m,int d){ 5 if(y<=0|m<0|m>13|d>31|d<0){ 6 printf("Input errors!"); 7 return 0; 8 } 9 else 10 return 1; 11 } 12 13 //进行运算的过程函数,输出结果的算法 14 void outTom(int y, int m,int d){ 15 d++; 16 switch(d){ 17 case 32:{ 18 d=1; 19 m++; 20 if(m==13){ 21 m=1;y++; 22 } 23 break; 24 } 25 case 31:{ 26 switch(m){ 27 case 1: 28 case 3: 29 case 5: 30 case 7: 31 case 8: 32 case 10: 33 case 12: 34 { 35 break; 36 } 37 case 4: 38 case 6: 39 case 9: 40 case 11: 41 { 42 d=1; 43 m++; 44 break; 45 } 46 default: 47 printf("This month has no such day!"); 48 49 } 50 break; 51 } 52 case 30:{ 53 if((m==2)&&((y%400==0)||(y&4==0&&y%100!=0))){ 54 m++; 55 d=1; 56 } 57 break; 58 } 59 case 29:{ 60 if(!((y%400==0)||(y&4==0&&y%100!=0))){ 61 m++; 62 d=1; 63 } 64 break; 65 } 66 default: break; 67 68 } 69 printf("Tomorrow is %d/%d/%d",y,m,d); 70 } 71 72 int main(){ 73 //第一步完成数据的输入 74 int y,m,d; 75 printf("please input the date today:year,moth,day,using \‘,\‘ to distinct!\n"); 76 scanf("%d,%d,%d",&y,&m,&d); 77 //完成数据的验证 78 if((valid(y,m,d))==0){ 79 return 0; 80 } 81 printf("The date today is %d/%d/%d\n",y,m,d); 82 //输出结果 83 outTom(y,m,d); 84 return 0; 85 }
(4)用两种方法求平方根:
1.用迭代法求数a的平方根Xn=1/2*(Xn-1)+a/Xn-1),取a/2作为迭代的初值,迭代结束条件取|Xn-Xn-1|<=10e-5:
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 float a,x0,x1; 6 scanf("%f",&a); 7 x1=a/2; 8 do{ 9 x0=x1; 10 x1=(x0+a/x0)/2; 11 }while(fabs(x1-x0)>1e-5); 12 printf("a=%f,squart(a)=%f\n",a,x1); 13 return 0; 14 }
2.用二分法求数a的平方根:
1 #include<stdio.h> 2 #include<math.h> 3 4 float find(float low,float high,float a){ 5 float middle=(low+high)/2; 6 if(middle*middle<fabs(a)) 7 return middle; 8 else if(middle*middle>a) 9 high=middle; 10 else if(middle*middle<a) 11 low=middle; 12 float result=find(low,high,a); 13 return result; 14 } 15 16 float sqt(float in){ 17 float low,high; 18 if(in<1){ 19 low=0; 20 high=1; 21 } 22 else{ 23 for(int i=0;i<=in;i++){ 24 if((float)i*i==in) 25 return (float)i; 26 else if(i*i<in&&(i+1)*(i+1)>in){ 27 low=(float)i; 28 high=(float)(i+1); 29 } 30 } 31 } 32 return find(low,high,in); 33 } 34 35 int main(){ 36 float a,result; 37 printf("please input a float number:\n"); 38 scanf("%f",&a); 39 if(a<0){ 40 printf("Input error!"); 41 return 0;} 42 result=sqt(a); 43 printf("Squrt(%f)=%f",a,result); 44 return 0; 45 }
(5)利用公式求sinX的近似值:
sinx=x-x^3/3!+x^5/5!-x^7/7!+.....+(-1)^(2n+1)/(2n+1)!
这里x是弧度。这是一个级数求和问题。
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 int k,i,n;//这里n是控制精确度的,n越大精确度越高。 6 double s,a,b,x; 7 scanf("%d%lf",&n,&x); 8 s=0; 9 x=x*3.141593/180;//将输入的角度转化为弧度 10 for(int i=1;i<=n;i++){ 11 a=b=1; 12 for(k=1;k<=2*i-1;k++){ 13 a=a*x; 14 b=b*k; 15 } 16 s=s+pow(-1,i+1)*a/b; 17 } 18 printf("sinx=%lf\n",s); 19 return 0; 20 }
(6)计算正弦曲线y=sin(x)在[0,PI]上与x轴所围成的平面图形的面积。计算定积分的公式为:
s=(h/2)*[f(a)+f(b)]+h*(从i=1到n-1)Ef(Xi),其中,Xi=a+ih,h=(b-a)/n,本例取n=100。
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 int i,n; 6 double a,b,h,s; 7 printf("Input a b:"); 8 scanf("%lf%lf",&a,&b); 9 n=100; 10 h=(b-a)/n; 11 s=0.5*(sin(a)+sin(b)); 12 for(i=1;i<=n-1;i++){ 13 s+=sin(a+i*h); 14 } 15 s*=h; 16 printf("s=%8.4lf\n",s); 17 return 0; 18 }
(7)找出100~999之间的所有"水仙花"数,所谓"水仙花"数是指一个三位数,其各位数字的立方和等于该数其各位数字的立方和等于该数本身,例如153=1^3+3^3+5^3,所以153是水仙花数。
方法一:
设100<=n<=999,i,j,k分别代表数n百位、十位,个位上的数字,则:
i=n/100
j=n/10%10
k=n%10
如果j^3+i^3+k^3=n,则n即为所求。
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 int i,j,k,n; 6 for(n=100;n<=999;n++){ 7 i=n/100; 8 j=n/10%10; 9 k=n%10; 10 if(n==(i*i*i+j*j*j+k*k*k)) 11 printf("%d\n",n); 12 } 13 return 0; 14 }
方法二:
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(){ 5 int i,j,k; 6 int n; 7 for(i=1;i<10;i++) 8 for(j=0;j<10;j++) 9 for(k=0;k<10;k++){ 10 n=i*100+j*10+k; 11 if((i*i*i+j*j*j+k*k*k)==n){ 12 printf("%d是水仙花数!\n",n); 13 } 14 } 15 return 0; 16 }