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;
}
     ```
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章