C++初学必练基础题【第二期】

前言

Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!

7-11 分段计算居民水费 (10 分)

题目

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4_x_/3;超过后,y=2.5_x_−17.5。请编写程序实现水费的计算。

输入格式:

输入在一行中给出非负实数x。

输出格式:

在一行输出应交的水费,精确到小数点后2位。

输入样例1:

12

输出样例1:

16.00

输入样例2:

16

输出样例2:

22.50

解答

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int x;
    double y;
    cin >> x;
    if (x <= 15)
    {
        y = 4 * x / 3.0;
    }
    else
    {
        y = 2.5 * x - 17.5;
    }
    cout << fixed << setprecision(2) << y << endl;
    return 0;
}
image.png

7-12 两个数的简单计算器 (10 分)

题目

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

输入格式:

输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。

输出格式:

当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。

输入样例1:

-7 / 2

输出样例1:

-3

输入样例2:

3 & 6

输出样例2:

ERROR

解答

#include <iostream>
using namespace std;
int main()
{
    int a, b;
    char c;
    cin >> a >> c >> b;
    switch (c)
    {
    case '+':
        cout << a + b << endl;
        break;
    case '-':
        cout << a - b << endl;
        break;
    case '*':
        cout << a * b << endl;
        break;
    case '/':
        cout << a / b << endl;
        break;
    case '%':
        cout << a % b << endl;
        break;
    default:
        cout<<"ERROR"<<endl;
        break;
    }
    return 0;
}
image.png

7-13 日K蜡烛图 (15 分)

题目

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果Close<Open,表示为“BW-Solid”(即“实心蓝白蜡烛”);如果Close>Open,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

输入格式:

输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。

输出格式:

在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow。

输入样例1:

5.110 5.250 5.100 5.105

输出样例1:

BW-Solid with Lower Shadow and Upper Shadow

输入样例2:

5.110 5.110 5.110 5.110

输出样例2:

R-Cross

输入样例3:

5.110 5.125 5.112 5.126

输出样例3:

R-Hollow

解答

#include <iostream>
using namespace std;
int main()
{
    double open;
    double high;
    double low;
    double close;
    cin >> open >> high >> low >> close;
    string str = "";
    if (close < open)
    {
        str += "BW-Solid";
    }
    else if (close == open)
    {
        str += "R-Cross";
    }
    else
    {
        str += "R-Hollow";
    }
    string str2 = "";
    if (high > open && high > close && low < open && low < close)
    {
        str2 += " with Lower Shadow and Upper Shadow";
    }else{
        if (high > open && high > close)
    {
        str2 += " with Upper Shadow";
    }
    if (low < open && low < close)
    {
        str2 += " with Lower Shadow";
    }  
    }
    cout << str << str2 << endl;
    return 0;
}
image.png

7-14 求整数段和 (15 分)

题目

给定两个整数AB,输出从AB的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。

输入样例:

-3 8

输出样例:

-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30

解答

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int a, b;
    cin >> a >> b;
    int i, sum = 0, k = 0;
    for (i = a; i <= b; i++)
    {
        k++;
        if (k < 5)
        {
            cout << setiosflags(ios::right) << setw(5) << i;
        }
        if (k == 5)
        {
            cout << setiosflags(ios::right) << setw(5) << i << endl;
            k = 0;
        }
        sum = sum + i;
    }
    if (k != 0)
        cout << endl;
    cout << "Sum = " << sum << endl;
    return 0;
}
image.png

7-15 计算圆周率 (15 分)

题目

根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
2/π=1+31+3×52!+3×5×73!+⋯+3×5×7×⋯×(2n+1)n!+⋯


image.png

输入格式:

输入在一行中给出小于1的阈值。

输出格式:

在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例:

0.01

输出样例:

3.132157

解答

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    double value;
    cin >> value;
    double sum = 1;
    int n = 0;
    long a = 1;
    double b = 1;
    double last = a / b;
    while (last >= value)
    {
        ++n;
        a *= n;
        b *= (2 * n + 1);
        last = a / b;
        sum += last;
    }
    cout << fixed << setprecision(6) << sum*2 << endl;
    return 0;
}
image.png

7-16 求符合给定条件的整数集 (15 分)

题目

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:

2

输出样例:

234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

解答

暴力枚举

#include <iostream>
using namespace std;
int main()
{
    int A;
    cin >> A;
    int count = 0;
    for (int i = A; i <= A + 3; ++i)
    {
        for (int j = A; j <= A + 3; ++j)
        {
            for (int k = A; k <= A + 3; ++k)
            {
                if (i != j && i != k && j != k)
                {
                    cout << i * 100 + j * 10 + k;
                    ++count;
                    if (count % 6 == 0)
                    {
                        cout << endl;
                        count = 0;
                    }
                    else
                    {
                        cout << " ";
                    }
                }
            }
        }
    }
    return 0;
}
image.png

回溯

#include <iostream>
#include <vector>
using namespace std;
vector<int> temp;
void backtracking(vector<vector<int> > &res, vector<bool> &isused, vector<int> &nums)
{
    // 当temp数组的长度等于期望数组的长度时 return
    if (temp.size() == 3)
    {
        res.push_back(temp);
        return;
    }
    // 遍历所有选择
    for (int i = 0; i < nums.size(); ++i)
    {
        // 对没有选择过的元素再进行抉择:选择它|不选择它
        if (isused[i])
        {
            // 选择该元素 选择后标记该元素为已选择 同时进行下一元素的抉择
            temp.push_back(nums[i]);
            isused[i] = false;
            backtracking(res, isused, nums);
            // 回复原来状态:未选择 同时从temp中pop出
            isused[i] = true;
            temp.pop_back();
        }
    }
}
vector<vector<int> > permute(vector<int> &nums)
{
    vector<vector<int> > res;
    vector<bool> isused(nums.size(), true);
    backtracking(res, isused, nums);
    return res;
}
int main()
{
    vector<vector<int> > ans;
    vector<int> nums;
    int N;
    cin >> N;
    for (int i = N; i <= N + 3; ++i)
    {
        nums.push_back(i);
    }
    ans = permute(nums);
    int count = 0;
    for (int i = 0; i < ans.size(); ++i)
    {
        for (int j = 0; j < ans[0].size(); ++j)
        {
            cout << ans[i][j];
        }
        ++count;
        if (count % 6 == 0)
        {
            cout << endl;
            count = 0;
        }
        else
        {
            cout << " ";
        }
    }
    return 0;
}
image.png

7-17 爬动的蠕虫 (15 分)

题目

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:

输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。

输出格式:

在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:

12 3 1

输出样例:

11

解答

#include <iostream>
using namespace std;
int main()
{
    int N;
    int U;
    int D;
    cin >> N >> U >> D;
    int minutes = 0;
    while (N)
    {
        ++minutes;
        N -= U;
        if (N <= 0)
        {
            cout << minutes << endl;
            break;
        }
        ++minutes;
        N += D;
    }
    return 0;
}
image.png

7-18 二分法求多项式单根 (20 分)

题目

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。

本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a,b]内的根。

输入格式:

输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1
-0.5 0.5

输出样例:

0.33

解答

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
double f(double num, double a3, double a2, double a1, double a0)
{
    return a3 * pow(num, 3) + a2 * pow(num, 2) + a1 * num + a0;
}
int main()
{
    double a3, a2, a1, a0;
    double a, b;
    cin >> a3 >> a2 >> a1 >> a0;
    cin >> a >> b;
    while (1)
    {
        double mid = a + (b - a) / 2.0;
        if (f(mid, a3, a2, a1, a0) == 0 || b - a < 0.000001)
        {
            cout << fixed << setprecision(2) << mid << endl;
            break;
        }
        else if (f(mid, a3, a2, a1, a0) * f(a, a3, a2, a1, a0) > 0)
        {
            // a mid 同号
            // 在mid-b间
            a = mid;
        }
        else if (f(mid, a3, a2, a1, a0) * f(b, a3, a2, a1, a0) > 0)
        {
            // mid b 同号
            // 在 a-mid间
            b = mid;
        }

        else
        {
            // 不需要再处理了
            // 题目保证初始ab区间一定有解的
        }
    }
    return 0;
}
image.png

7-19 支票面额 (15 分)

题目

一个采购员去银行兑换一张yf分的支票,结果出纳员错给了fy分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2_y_元2_f_分,问该支票面额是多少?

输入格式:

输入在一行中给出小于100的正整数n。

输出格式:

在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1:

23

输出样例1:

25.51

输入样例2:

22

输出样例2:

No Solution

解答

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int flag = 1;
    for (int i = 0; i < 100 && flag == 1; ++i)
    {
        for (int j = 0; j < 100; ++j)
        {
            if (98 * i - 199 * j == n)
            {
                cout << j << "." << i << endl;
                flag = 0;
                break;
            }
        }
    }
    if (flag == 1)
    {
        cout << "No Solution" << endl;
    }
    return 0;
}
image.png

7-20 打印九九口诀表 (15 分)

题目

下面是一个完整的下三角九九口诀表:

11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25 1
6=6 26=12 3
6=18 46=24 56=30 66=36
1
7=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 9*9=81

本题要求对任意给定的一位正整数N,输出从11到NN的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16

解答

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (i >= j)
            {
                cout << j << "*" << i << "=" << setiosflags(ios::left) << setw(4) << i * j;
            }
        }
        cout << endl;
    }
    return 0;
}
image.png

结语

文章仅作为学习笔记,记录从0到1的一个过程

希望对您有所帮助,如有错误欢迎小伙伴指正~

我是 <font color="#0984e3">海轰ଘ(੭ˊᵕˋ)੭</font>

如果您觉得写得可以的话,请点个赞吧

谢谢支持❤️


在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容