演算法筆記2.3 codeup課後習題
問題 A: 例題4-1 一元二次方程求根
時間限制: 1 Sec 記憶體限制: 12 MB
題目描述
求一元二次方程ax2+bx+c=0的根,三個係數a, b, c由鍵盤輸入,且a不能為0,但不保證b2-4ac>0。
程式中所涉及的變數均為double型別。
輸入
以空格分隔的一元二次方程的三個係數,雙精度double型別
輸出
分行輸出兩個根如下(注意末尾的換行):
r1=第一個根
r2=第二個根
結果輸出時,寬度佔7位,其中小數部分2位。
如果方程無實根,輸出一行如下資訊(注意末尾的換行):
No real roots!
樣例輸入
1 2 3
樣例輸出
No real roots!
解答:
#include<iostream> #include<cmath> using namespace std; int main(){ double a,b,c,dt; double x1,x2; while(cin>>a>>b>>c){ dt=b*b-4*a*c; if(dt<0){ cout<<"No real roots!"<<endl; }else{ dt=sqrt(dt); x1=(-b+dt)/(2*a); x2=(-b-dt)/(2*a); printf("r1=%f\n",x1); printf("r2=%f\n",x2); } } return 0; }
問題 B: 例題4-2 比較交換實數值
時間限制: 1 Sec 記憶體限制: 12 MB
題目描述
從鍵盤輸入2個實數,按照代數值由小到大的順序輸出這兩個數。
輸入
用空格分隔的兩個實數。
輸出
從小到大輸出這兩個實數,中間以空格來分隔,小數在前,大數在後。
小數點後保留2位小數。
末尾輸出換行符。
樣例輸入
3.6 -2.3
樣例輸出
-2.30 3.60
#include <iostream> using namespace std; int main() { double x,y,t; while(cin>>x>>y){ if(x>y){ t=x; x=y; y=t; } printf("%.2f %.2f\n",x,y); } return 0; }
問題 C: 例題4-3 比較交換3個實數值,並按序輸出
時間限制: 1 Sec 記憶體限制: 12 MB
題目描述
從鍵盤輸入3個實數a, b, c,通過比較交換,將最小值儲存在變數a中,最大值儲存在變數c中,中間值儲存在變數b中,並按照從小到大的順序輸出這三個數a, b, c。
末尾輸出換行。
輸入
輸入以空格分隔的三個實數
輸出
按照從小到大的順序輸出這三個實數,中間以空格分隔,最小值在前,最大值在後。小數點後保留2位小數。
注意末尾的換行。
樣例輸入
3 7 1
樣例輸出
1.00 3.00 7.00
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
double a,b,c;
while(cin>>a>>b>>c){
double t[3];
t[0]=a;
t[1]=b;
t[2]=c;
sort(t,t+3);
a=t[0];
b=t[1];
c=t[2];
printf("%.2f %.2f %.2f\n",a,b,c);
}
return 0;
}
問題 D: 習題4-4 三個整數求最大值
時間限制: 1 Sec 記憶體限制: 12 MB
題目描述
有3個整數a, b, c,由鍵盤輸入,輸出其中最大的數。
輸入
以空格分割的三個整數。
輸出
三個數中的最大值,末尾換行。
樣例輸入
1 3 2
樣例輸出
3
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
while(cin>>a>>b>>c){
int max=a;
if(b>max){
max=b;
}
if(c>max){
max=c;
}
cout<<max<<endl;
}
return 0;
}
問題 E: 習題4-10-1 獎金計算
時間限制: 1 Sec 記憶體限制: 12 MB
題目描述
某企業發放的獎金根據利潤提成。利潤I低於或等於100000時,獎金可提10%;利潤高於100000元,低於200000元(100000<I<=200000)時,低於100000元的部分仍按10%提成,高於100000元的部分提成比例為7.5%;200000<I<=400000時,低於200000元的部分仍按上述方法提成(下同),高於200000元的部分按5%提成;400000<I<=600000元時,高於400000元的部分按3%提成;600000<I<=1000000時,高於600000元的部分按1.5%提成;I>1000000元時,超過1000000元的部分按1%提成。
從鍵盤輸出當月利潤I,求應發獎金數,獎金精確到分。
要求用if語句實現。
輸入
企業利潤,小數,雙精度double型別
輸出
應發獎金數,保留2位小數,末尾換行。
樣例輸入
1050
樣例輸出
105.00
#include <iostream>
using namespace std;
int main()
{
double l;
double bonus;
while(cin>>l){
bonus=0;
if(l<=100000){//10%
bonus=l*0.1;
}else if(l<=200000){//7.5%
bonus=100000*0.1+(l-100000)*0.075;
}else if(l<=400000){//5%
bonus=100000*0.1+100000*0.075+(l-200000)*0.05;
}else if(l<=600000){//3%
bonus=100000*0.1+100000*0.075+200000*0.05+(l-400000)*0.03;
}else if(l<=1000000){//1.5%
bonus=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(l-600000)*0.015;
}else{//1%
bonus=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(l-1000000)*0.01;
}
printf("%.2f\n",bonus);
}
return 0;
}