综合练习三
问题 A: 解一元二次方程
解一元二次方程是初中数学必须掌握的一个重点。在不考虑虚数的情况下,一个一元二次方程的解有三种情况:有两个不同的解、有两个相同的解以及无解。
本题需要你通过编程来解一元二次方程ax2+bx+c=0的根。
输入要求
输入数据有若干行,每行包含一元二次方程的三个系数,依次为二次项系数、一次项系数以及常数。系数a为0输出出错信息(Error!),三个系数同时为0时输入结束,该组数据不做处理。
输出要求
当一元二次方程有两个不同的解时,先输出较大的解,再输出较小的解,如:
x1=2.000000
x2=1.000000
当一元二次方程有两个相同的解时,两个解一起输出,如:
x1=x2=1.000000
当一元二次方程无解时,输出”No solution!”(忽略双引号)。
结果保留6位小数。
假如输入
1 -2 1 3 2 1 2 3 1 0 2 1 0 0 0
应当输出
x1=x2=1.000000 No solution! x1=-0.500000 x2=-1.000000 Error!
#include<stdio.h> #include<math.h> int main(void) { int a,b,c; while(1) { double x1,x2,delta,t; scanf("%d %d %d",&a,&b,&c); delta=b*b-4*a*c; x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); if(a!=0){ if(delta>0) { if(x1>x2){ printf("x1=%.6f\n",x1); printf("x2=%.6f\n",x2); } else{ t=x2;x2=x1;x1=t; printf("x1=%.6f\n",x1); printf("x2=%.6f\n",x2); } } else if(delta==0) printf("x1=x2=%.6f\n",x1); else printf("No solution!\n"); } else if(a==0 && b!=0||c!=0){ printf("Error!\n"); } if(a==0 && b==0 && c==0) break; } return 0; }
问题 B: 计算π
题目描述
用下面公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一项的绝对值小于10的-n次方为止(绝对值小于10的-n次方的这项不计算在内)。
输入要求
输入若干组精度要求n(3<=n<=8),n=0时退出,n超出范围输出“Error!”。
输出要求
输出各组不同精度要求的值。
假如输入
7
0
应当输出
3.141592
#include<stdio.h> #include<math.h> int main(void) { int n; double pi=0,a=1,b=1; while(1){ scanf("%d",&n); if(n>=3 && n<=8){ while(fabs(a/b)>=pow(10,-n)){ pi+=a/b; b+=2; a=-a; } printf("%lf\n",pi*4); } else if(n!=0) printf("Error!\n"); else break; } return 0; }
问题 C: 求矩阵中的最大元素
有一个M×N的矩阵,各数据元素均为整形数,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号,同一矩阵中有相同最大元素时不同行以行坐标最小优先,同行不同列以列坐标最小优先。
输入要求
首先输入被测试矩阵的数量k(1<=k<=10); 然后输入k个矩阵的行列数m,n,(1<=m,n<=10)和相应矩阵的各个元素。
输出要求
每一行中输出一个矩阵的最大元素的值及所在的行列坐标,元素之间用空格分隔。
假如输入
1
3 4
5 12 23 56
19 28 37 46
-12 -34 6 8
应当输出
max=56 row=0 colum=3
#include<stdio.h> int main(void) { int row,colum,i,j,x; int k,m,n; int a[10][10]; scanf("%d\n",&k); for(x=1;x<=k;x++){ scanf("%d %d\n",&m,&n); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); row=colum=0; for(i=0;i<m;i++) for(j=0;j<n;j++) if(a[i][j]>a[row][colum]){ row=i; colum=j; } printf("max=%d row=%d colum=%d\n",a[row][colum],row,colum); } return 0; }
问题 D: 求给定两整数的最大公约数和最小公倍数
求给定两整数m,n的最大公约数和最小公倍数。
输入要求
输入分两部分,首先输入要测试的数据K,然后输入K组测试数据,每组数据包括m,n(m,n<=1000)两个正整数。
输出要求
输出最大公约数和最小公倍数,两个数之间用空格分隔,每组测速数据的答案之间用空行分隔。
假如输入
2
34 6
26 8
应当输出
Greatest common divisor is: 2 Least common multiple is: 102
Greatest common divisor is: 2 Least common multiple is: 104
#include<stdio.h> int main(void) { int m,n,k,i; int r,x,t; scanf("%d",&k); for(i=1;i<=k;i++){ scanf("%d %d",&m,&n); x = m*n; if (m<n) { t=m; m=n; n=t; } while (n!=0) { r=m%n; m=n; n=r; } printf("Greatest common divisor is: %d Least common multiple is: %d\n",m,x/m); printf("\n"); } return 0; }