1. 程式人生 > >演算法筆記2.3 codeup課後習題

演算法筆記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;
}