1. 程式人生 > >《演算法筆記》2.3小節

《演算法筆記》2.3小節

接上....前面這幾部分做的有點趕...變數名起的有點隨意QAQ...哪天有空回爐重造一下

問題 A: 例題4-1 一元二次方程求根

題目描述

求一元二次方程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>
#include <iomanip> 
using namespace std;
int main()
{
     
double a,b,c,r1,r2;
cin>>a>>b>>c;
r1=(-b+sqrt(b*b-4*a*c))/(2*a); 
r2=(-b-sqrt(b*b-4*a*c))/(2*a); 
if(b*b-4*a*c>=0)
{
    cout<<"r1="<<setw(7)<<setiosflags(ios::fixed)<<setprecision(2)<<r1
    <<endl<<"r2="<<setw(7)<<setiosflags(ios::fixed)<<setprecision(2)<<r2;
}
else
    cout<<"No real roots!"<<endl;
 
return 0;
 
} 

問題 B: 例題4-2 比較交換實數值

題目描述

從鍵盤輸入2個實數,按照代數值由小到大的順序輸出這兩個數。

輸入

用空格分隔的兩個實數。

輸出

從小到大輸出這兩個實數,中間以空格來分隔,小數在前,大數在後。

小數點後保留2位小數。

末尾輸出換行符。

樣例輸入

3.6 -2.3

樣例輸出

-2.30 3.60
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
     
double a,b,min,max;
cin>>a>>b;
if(a>b)
{
    max=a;
    min=b;
}
else
{
    max=b;
    min=a;
}
 
cout<<setiosflags(ios::fixed)<<setprecision(2)<<min<<" "<<
    setiosflags(ios::fixed)<<setprecision(2)<<max<<endl;
 
return 0;
 
} 

問題 C: 例題4-3 比較交換3個實數值,並按序輸出

題目描述

從鍵盤輸入3個實數a, b, c,通過比較交換,將最小值儲存在變數a中,最大值儲存在變數c中,中間值儲存在變數b中,並按照從小到大的順序輸出這三個數a, b, c。

末尾輸出換行。

輸入

輸入以空格分隔的三個實數

輸出

按照從小到大的順序輸出這三個實數,中間以空格分隔,最小值在前,最大值在後。小數點後保留2位小數。

注意末尾的換行。

樣例輸入

3 7 1

樣例輸出

1.00 3.00 7.00
    #include<iostream>
    #include <iomanip>
    using namespace std;
    int main()
    {
         
    double a,b,c,temp;
    cin>>a>>b>>c;
    if(a>b)
    {   
        temp=a;
        a=b;
        b=temp;
    }
    if(a>c)
    {
        temp=a;
        a=c;
        c=temp;
    }
    if(b>c)
    {
        temp=b;
        b=c;
        c=temp;
    }
     
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<a<<" "<<
        setiosflags(ios::fixed)<<setprecision(2)<<b<<" "<<
        setiosflags(ios::fixed)<<setprecision(2)<<c<<endl;
     
    return 0;
     
    } 

問題 D: 習題4-4 三個整數求最大值

題目描述

有3個整數a, b, c,由鍵盤輸入,輸出其中最大的數。

輸入

以空格分割的三個整數。

輸出

三個數中的最大值,末尾換行。

樣例輸入

1 3 2

樣例輸出

3
    #include<iostream>
    #include <iomanip>
    using namespace std;
    int main()
    {
         
    int a,b,c,temp;
    cin>>a>>b>>c;
    if(a>b)
    {   
        temp=a;
        a=b;
        b=temp;
    }
    if(a>c)
    {
        temp=a;
        a=c;
        c=temp;
    }
    if(b>c)
    {
        temp=b;
        b=c;
        c=temp;
    }
     
    cout<<c<<endl;
     
    return 0;
     
    } 
 

直接複製上一題的程式碼...⊙﹏⊙‖∣

問題 E: 習題4-10-1 獎金計算

題目描述

某企業發放的獎金根據利潤提成。利潤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>
    #include <iomanip>
    using namespace std;
    int main()
    {
         
    double l,a=0;
    cin>>l;
    if(l<=100000)
    {   
        a+=l*0.1;
    }
    else if(l>100000&&l<=200000)
    {
        a+=10000+(l-100000)*0.075;
    }
    else if(l>200000&&l<=400000)
    {
        a+=17500+(l-200000)*0.05;
    }
    else if(l>400000&&l<=600000)
    {
        a+=27500+(l-400000)*0.03;
    }
    else if(l>600000&&l<=1000000)
    {
        a+=33500+(l-600000)*0.015;
    }
    else
    {
        a+=39500+(l-1000000)*0.01;
    }
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<a<<endl;
     
    return 0;
     
    } 

眼睛都花了..以前的噩夢..現在也是