C++語言程序設計基礎(學堂在線)習題

C2-1簡單題目 (100/100 分數)
題目描述
任意給定 n 個整數,求這 n 個整數序列的和、最小值、最大值

輸入描述
輸入一個整數n,代表接下來輸入整數個數,0 < n <= 100,接着輸入n個整數,整數用int表示即可。

輸出描述
輸出整數序列的和、最小值、最大值。用空格隔開,佔一行

樣例輸入
2
1 2
樣例輸出
3 1 2

#include<stdio.h>
#include<iostream>

using namespace std;

int main()
{
    int number,sum=0,input_number,maximum=-10000000,minimum=1000000;
    cin >> number;
    for(int i=0;i<number;i++)
        {
            cin >> input_number;
            maximum = (maximum > input_number)?maximum:input_number;
            minimum = (minimum < input_number)?minimum:input_number;
            sum += input_number;
        }
    cout << sum << " " << minimum << " " << maximum << endl;
    return 0;
}

C2-2 進制轉換 (100 滿分)
題目描述
已知一個只包含 0 和 1 的二進制數,長度不大於 10 ,將其轉換爲十進制並輸出。

輸入描述
輸入一個二進制整數n,其長度大於0且不大於10

輸出描述
輸出轉換後的十進制數, 佔一行

樣例輸入
110

樣例輸出
6

#include<stdio.h>
#include<iostream>
#include<math.h>

using namespace std;


int main()
{
    int b_number,d_number=0,i=0,tmp;
    cin >> b_number;
    while(b_number)
    {
        tmp = b_number % 10;
        d_number += tmp * pow(2,i);
        ++i;
        b_number /= 10;
    }
    cout << d_number << endl;
    return 0;
}

C3-1 直角三角形 (100/100 分數)
題目描述

輸入一個三角形的3邊長度,判斷該三角形是否爲直角三角形,若是則輸出True,若不是則輸出False。推薦做法:定義一個函數,接受三個int參數,返回bool,再用主函數調用之。

輸入描述
每行輸入三個由空格隔開的整數 a, b, c ,表示三角形的 3 條邊長

1 <= a,b ,c <= 10000

輸出描述
對於每一行輸入,輸出True或者False表明是否爲直角三角形

樣例輸入
3 4 5
6 7 8
1 1 1

樣例輸出
True
False
False

#include<stdio.h>
#include<iostream>
#include<string>

using namespace std;


int is_triangle(int a,int b,int c)
{
    if(a * a + b * b == c * c)
        return 1;
    else if(a * a + c * c == b * b)
        return 1;
    else if (b * b + c * c == a * a)
        return 1;
    else
        return 0;
}
 
int main()
{
    int a,b,c,flag;
    string Flag;
    cin >> a >> b >> c;
    flag = is_triangle(a,b,c);
    Flag =(flag == 1)?"True":"False";
    cout << Flag << endl;
    return 0;
}

C3-2 斐波那契數列 (100 滿分)
題目描述
斐波那契數列f(n)滿足以下定義:

f(0) = 1, f(1) = 1, f(n) = f(n-1) + f(n-2) (n >= 2)。

請用遞歸的方法編寫函數,對於給定的n,求出斐波那契數列的第n項f(n)

輸入描述
每行輸入一個整數 n

0 <= n<= 30

輸出描述
對於每一行輸入,輸出斐波那契數列第n項的值f(n)

樣例輸入
1
10
25
樣例輸出
1
89
121393

  /* students please write your program here */
#include<stdio.h>
#include<iostream>

using namespace std;

int fib(int n);

int main()
{
    int n;
    cin >> n;
    cout << fib(n) << endl;
    return 0;
}

int fib(int n)
{
    int f0 = 1,f1 = 1,tmp;
    if(n==0)
        return 1;
    else if(n==1)
        return 1;
    else
        for(int i=0;i<=n-2;i++)
        {   
            tmp = f1;
            f1 = f0 + f1;
            f0 = tmp;
        }
        return f1;
}

C3-3 醜數 (100 滿分)
題目描述
只包含因子2,3,5的正整數被稱作醜數,比如4,10,12都是醜數,而7,23,111則不是醜數,另外1也不是醜數。請編寫一個函數,輸入一個整數n,能夠判斷該整數是否爲醜數,如果是,則輸出True,否則輸出False。

輸入描述
每行輸入一個正整數 n

1 <= n<= 1000000

輸出描述
對於每一行輸入,輸出其是否爲醜數,是則輸出True,否則輸出False

樣例輸入
4
7
12
樣例輸出
True
False
True

  /* students please write your program here */
//最後答案有一個沒通過,範例通過了90%,不知道哪裏有問題?
#include<stdio.h>
#include<iostream>
#include<string>

using namespace std;

int IsUgly(int num)//判斷是否是
{
	while (num %2 == 0)
	{
		num /= 2;
	}
	while (num %3 == 0)
	{
		num /= 3;
	}
	while (num %5 == 0)
	{
		num /= 5;
	}
	if (num == 1)
		return 1;
	else
		return 0;//not an ugly number
}

int main()
{
    int n,flag;
    string Flag;
    cin >> n;
    flag = IsUgly(n);
    Flag = (flag==1)?"True":"False";
    cout << Flag << endl;
    return 0;
}

C4-1 最大公約數 (100/100 分數)
題目描述
求兩個正整數a 和 b的最大公約數。

要求使用c++ class編寫程序。可以創建如下class

#include
using namespace std;
class Integer {
private:
int _num;
public:
//構造函數
Integer(int num) {
}
//計算當前Integer 和 b之間的最大公約數
int gcd(Integer b) {
}
};
int main(){
int a, b;
cin >> a >> b;
Integer A(a);
Integer B(b);
cout << A.gcd(B) << endl;
return 0;
}

輸入描述
兩個正整數a,b,並且1=<a,b <=10000

輸出描述
a和b的最大公約數

樣例輸入
1000 1000
樣例輸出
1000

#include<stdio.h>
#include<iostream>
using namespace std;

class Integer{
private:
    int _num;
public:
    Integer(int num)
    {
        _num = num;
    }

    int gcd(Integer b) 
    {
	int min = _num < b._num ? _num : b._num;
	int max = _num > b._num ? _num : b._num;
	for (int i = min; i >= 1; i--)
	{
	    if (max%i == 0 && min%i==0)
            {
		return i;
	    }
	}
 
    }
};

int main()
{
    int a,b;
    cin >> a >> b;
    Integer A(a);
    Integer B(b);
    cout << A.gcd(B) << endl;
    return 0;
}

C4-2 反轉整數 (100 滿分)
題目描述
對於輸入的一個正整數,輸出其反轉形式

要求使用c++ class編寫程序。可以創建如下class

#include
using namespace std;

class Integer{
private:
int _num;
//getLength()函數獲取_num長度
int getLength(){
}
public:
//Integer類構造函數
Integer(int num){
}
//反轉_num
int inversed(){
}
};

int main() {
int n;
cin >> n;
Integer integer(n);
cout << integer.inversed() << endl;
return 0;
}

輸入描述
一個正整數a ,且1=<a<=1,000,000,000

輸出描述
a的反轉形式

樣例輸入
1011
樣例輸出
1101

/* students please write your program here */

#include <iostream>
using namespace std;
 
class Integer{
private:
    int _num;
//getLength()函數獲取_num長度
    int getLength(){
        int length = 0;
        for(int i=_num;i!=0;i/=10)
        {length += 1;}
        return length;
    }
public:
//Integer類構造函數
    Integer(int num){
        _num = num;
    }
//反轉_num
    int inversed(){
        int result = 0,reminder;
        while(_num > 0)
        {
            reminder = _num % 10;
            result = result * 10 + reminder;
            _num /= 10;    
        }
        return result;
        }
};
 
int main() {
    int n;
    cin >> n;
    Integer integer(n);
    cout << integer.inversed() << endl;
    return 0;
}

C4-3 一元二次方程求解 (100 滿分)
題目描述
對於一元二次方程ax^2 + bx + c = 0,解可以分爲很多情況。

若該方程有兩個不相等實根,首先輸出1,換行,然後從小到大輸出兩個實根,換行;

若該方程有兩個相等實根,首先輸出2,換行,然後輸出這個這個實根,換行;

若該方程有一對共軛復根,輸出3,換行;

若該方程有無解,輸出4,換行;

若該方程有無窮個解,輸出5,換行;

若該方程只有一個根,首先輸出6,換行,然後輸出這個跟,換行;

要求使用c++ class編寫程序。可以創建如下class

//代碼通過90%樣例
#include <iostream>
#include <cmath>
#include<iomanip>

using namespace std;
class Equation{
private:
    int _a, _b, _c;
public:
    Equation(int a, int b, int c){
    _a = a;
    _b = b;
    _c = c;
    }
    void solve()
    {
    double value = _b * _b - 4 * _a * _c;
    if(_a == 0 && _b != 0)
    {
        double result=-_c/_b;
        cout << "6" << endl;
        cout << setprecision(2) << fixed << result << endl;        
    }
    else if(_a == 0 && _b == 0)
    {
        cout << "4" << endl;
    }
    else if(_a==0 && _b == 0 && _c == 0)
    {
        cout << "5" << endl;
    }
    else if(value < 0)
    {
        cout << "3" << endl;
    }
    else if(value == 0)
    {
        double result = -_b / _a / 2;
        cout << "2" << endl;
        cout << setprecision(2) << fixed << result << endl;
    }
    else if(value > 0)
    {
        double result1 = (-_b+sqrt(value))/2.0/_a;
        double result2 = (-_b-sqrt(value))/2.0/_a;
        cout << "1" << endl;
        if(result1 < result2)
        {
            cout << setprecision(2) << fixed << result1 << " " << setprecision(2) << fixed << result2 << endl;
        }
        else
        {
            cout << setprecision(2) << fixed << result2 << " " << setprecision(2) << fixed << result1 << endl;
        }
    }
    }
};

int main(){
    int a, b, c;
    cin >> a >> b >> c;
    Equation tmp(a, b, c);
    tmp.solve();
    return 0;
}

C5-1 “魚額寶” (100 滿分)
題目描述
請實現一個“魚額寶”類,下面已給出代碼模板,請根據main函數中對該類的操作,補充類實現部分完成代碼。

“魚額寶”類可以記錄賬戶餘額、存錢、取錢、計算利息。該類中有一個私有靜態成員變量profitRate存儲“魚額寶”的利率,可以用共有靜態成員函數setProfitRate修改利率的值。程序輸入爲第1天至第n天連續n天的賬戶操作,每天只能進行一次賬戶操作,或存或取,每一天產生的利息是前一天的賬戶餘額與“魚額寶”利率的乘積,產生的利息當天也將存入賬戶餘額,由於第1天之前賬戶不存在,所以第1天一定是新建賬戶並存錢,且當天不會有利息存入餘額。程序在接受n天操作的輸入後,要求計算出第n天操作完成後的賬戶餘額並輸出。代碼如下:

#include <iostream>
using namespace std;
  
class Yuebao
{
static double profitRate;
public:
    static void setProfitRate(double rate);
/* Your code here! */
};
  
int main()
{
    int n;
    while(cin >> n)
    {
        double profitRate;
        cin >> profitRate;
        Yuebao::setProfitRate(profitRate);//設定魚額寶的利率
        Yuebao y(0); //新建魚額寶賬戶,餘額初始化爲0
        int operation;//接受輸入判斷是存還是取
        double amount;//接受輸入存取金額
        for (int i = 0; i < n; ++i)
        {
            y.addProfit();//加入前一天餘額產生的利息
            cin >> operation >> amount;
            if (operation == 0)
                y.deposit(amount);//存入金額
            else
                y.withdraw(amount);//取出金額
        }
        cout << y.getBalance() << endl;//輸出最終賬戶餘額
    }
    return 0;
}

輸入描述
每個測例共 n+2 行

第 1 行輸入一個整數 n ,表示接下來有 n 天的操作

第 2 行輸入一個實數,爲 “ 魚額寶 ” 的利率, n 天中利率不變

接下來有 n 行,代表 n 天的操作,每行有 2 個數,第 1 個數或 0 或 1 , 0 表示存錢, 1 表示取錢,第二個實數爲存取的金額

1 <= n <= 20

輸出描述
對於每一個測例,輸出第n天操作完成後的賬戶餘額

樣例輸入
3
0.1
0 10
0 10
1 10
樣例輸出
13.1

#include<stdio.h>
#include<iostream>
using namespace std;

class Yuebao
{
    static double profitRate;
    double balance;
public:
    static void setProfitRate(double rate);
    void addProfit();
    double deposit(double amount);
    double withdraw(double amount);
    double getBalance();
    Yuebao(int init)
    {
        balance = init;
    }
    
};

int main()
{ 
    int n;
    while(cin >> n)
    {
	double profitRate;
	cin >> profitRate;
	Yuebao::setProfitRate(profitRate);
	Yuebao y(0);
	int operation;
	double amount;
	for (int i=0;i<n;++i)
	{
	    y.addProfit();
	    cin >> operation >> amount;
	    if (operation==0)
		y.deposit(amount);
	    else
		y.withdraw(amount);
	 }
	 cout << y.getBalance() << endl;
    }
    return 0;
}


double Yuebao::profitRate=0;
void Yuebao::setProfitRate(double rate)
{
    Yuebao::profitRate = rate;
}
void Yuebao::addProfit()
{
    Yuebao::balance += Yuebao::balance * Yuebao::profitRate;
}
double Yuebao::deposit(double amount)
{
    Yuebao::balance += amount;
}
double Yuebao::withdraw(double amount)
{
    Yuebao::balance -= amount;
}
double Yuebao::getBalance()
{ 
    return Yuebao::balance;
}

C5-2 數老鼠 (100 滿分)
題目描述
請實現一個老鼠類,下面已給出代碼模板,請根據main函數中對該類的操作,補充類實現部分完成代碼。

該類有個公有靜態變量num記錄該類的所有對象數,主函數將會在不同語句之後輸出對象數,只有正確地實現該類,保證num正確記錄該類的對象數,才能輸出正確的結果。

#include
using namespace std;

class Mouse{
/* Your code here! */
};

void fn(Mouse m);

int main()
{
Mouse::num = 0;
Mouse a;
cout << Mouse::num << endl;
Mouse b(a);
cout << Mouse::num << endl;
for (int i = 0; i < 10; ++i)
{
Mouse x;
cout << Mouse::num << endl;
}
fn(a);
cout << Mouse::num << endl;
return 0;
}

void fn(Mouse m)
{
cout << Mouse::num << endl;
Mouse n(m);
cout << Mouse::num << endl;
}

輸入描述
輸出描述
主函數的輸出已經寫好

樣例輸入 樣例輸出

#include<iostream>

using namespace std;

class Mouse
{ 
public:
    static int num;
    Mouse()
    {
        num += 1;
    }
    Mouse(const Mouse &m)
    {
        num += 1;
    }
    ~Mouse()
    {
        num -= 1;
    }
};

int Mouse::num = 0;
void fn(Mouse m);

int main()
{
    Mouse::num = 0;
    Mouse a;
    cout << Mouse::num << endl;
    Mouse b(a);
    cout << Mouse::num << endl;
    for (int i=0;i < 10;i++)
    {
        Mouse x;
        cout << Mouse::num << endl;
    }
    fn(a);
    cout << Mouse::num << endl;
    return 0;
}

void fn(Mouse m)
{
    cout << Mouse::num << endl;
    Mouse n(m);
    cout << Mouse::num << endl;
}

C6-1 最大子數組和 (100 滿分)
題目描述
給定一個數組a[0,…,n-1],求其最大子數組(長度>=1)和

輸入描述
第一行一個整數n(1<=n<=5000),然後依次輸入n個整數(每個整數範圍[-5000, 5000])

輸出描述
輸出一個整數表示最大子數組和

樣例輸入
5
1 -1 1 1 -1

樣例輸出
2

#include<stdio.h>
#include<iostream>


using namespace std;


int main()
{
    int sum=0,max=0,n,tmp=0;
    cin >> n;
    for(int i=0;i<n;i++)
    { 
        cin >> tmp;
        if(sum > 0)
            sum += tmp;
        else
            sum = tmp;
        if(sum > max)
            max = sum;
    }
cout << max << endl;
return 0;
}

C6-2 字符串的迴文子序列個數 (100 滿分)
題目描述
求一個長度不超過15的字符串的迴文子序列個數(子序列長度>=1)。

輸入描述
輸入一個長度不超過15的字符串,字符串均由小寫字母表示

輸出描述
輸出其迴文子序列個數

樣例輸入
abaa

樣例輸出
10

註釋
本例中其所有迴文子序列爲:
a,b,a,a,aba,aba,aa,aa,aa,aaa
一個字符串的子序列是指在原字符串上去除某些字符但不破壞餘下元素的相對位置(在前或在後)而形成的新字符串。

C6-3 數組第K小數 (100 滿分)
題目描述
給定一個整數數組a[0,…,n-1],求數組中第k小數

輸入描述
首先輸入數組長度n和k,其中1<=n<=5000, 1<=k<=n

然後輸出n個整形元素,每個數的範圍[1, 5000]

輸出描述
該數組中第k小數

樣例輸入
4 2
1 2 3 4

樣例輸出
2

#include<iostream>
#include<list>
#include<algorithm>

using namespace std;

void remove_minimum(list<int> &l)
{
    int minimum=1000000;
    list<int>::iterator pos;
    for(auto each:l)
    {
        if(each < minimum)
            minimum = each;
    }
    pos = find(l.begin(),l.end(),minimum);
    l.erase(pos);
    return;
}

int main()
{
    list<int> lst;
    int n,k,k_minimum=1000000,tmp;
    cin >> n >> k;
    for(int i=0;i<n;i++)
    {
        cin >> tmp;
        lst.push_back(tmp);
    }
    for(int i=0;i<k-1;i++)
        remove_minimum(lst);
    for(auto each:lst)
        if(each < k_minimum)
            k_minimum = each;
    cout << k_minimum << endl;
}
     ```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章