C++系列案例-大数据减法-绘制余弦曲线-兔子数量-快速排序

news2024/11/25 20:15:41

文章目录

  • 关于C++的几个经典案例代码
    • 大数减法问题
    • 绘制余弦曲线
    • 兔子数量问题
    • 快速排序问题
    • 函数运行
    • 全部源码

关于C++的几个经典案例代码

大数减法问题

因为较大整数的相加很可能超出整型的32位限制,或者本身就是超出限制的大数之间的加减运算。
所以我们需要单独写一个能大数相加减的函数
基本原理:把数字用字符串的形式来保存加减的结果或大数字本身就不会超出限制,比如“999999999999999999999999999999” 多长都可以。

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

using namespace std;
//************************大数减法******************************

bool cmp(vector<int> &A,vector<int> &B)
{
    if(A.size()!=B.size())
    {
        return A.size()>B.size();
    }
    for(int i = A.size(); i>=0; i--) //A,B长度相同
    {
        if(A[i]!=B[i])
        {
            return A[i]>B[i];
        }
    }
    return true;
}

vector<int> sub(vector<int> &A,vector<int> &B) //C=A-B
{
    int t = 0;//借位
    vector<int> C;
    for(int i = 0; i<A.size(); i++)
    {
        t = A[i]-t;
        if(i<B.size())
        {
            t-=B[i];
        }
        C.push_back((t+10)%10);
        if(t<0)
        {
            t = 1;
        }
        else
        {
            t = 0;
        }
    }
    while(C.size()>1&&C.back()==0) //去除多余前导0
    {
        C.pop_back();              //同时要注意A-B=0时不能把去除掉
    }
    return C;
}

void subRun() //求A-B
{
    string a,b;
    vector<int> A,B,C;
    cin>>a>>b;
    for(int i = a.size()-1; i>=0; i--)
    {
        A.push_back(a[i]-'0');//记得转为数字
    }
    for(int i = b.size()-1; i>=0; i--)
    {
        B.push_back(b[i]-'0');
    }
    if(cmp(A,B)) //A>=B
    {
        C = sub(A,B);
        for(int i = C.size()-1; i>=0; i--)
        {
            cout<<C[i];
        }
    }
    else //A<B
    {
        C = sub(B,A);
        cout<<"-";
        for(int i = C.size()-1; i>=0; i--)
        {
            cout<<C[i];
        }
    }
}

绘制余弦曲线

余弦函数曲线 分析:输出余弦曲线,余弦曲线坐标显示分为x轴和y轴 即一个x对应一个y值,且余弦函数的是关于π对称的,需要注意的是cos()函数使用的是 弧度.acos函数是反余弦函数。本例基于acos绘制余弦函数。

//************************绘制余弦曲线******************************
void drawCos()
{
    double y;
    int x,m;
    for(y=1; y>=-1; y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/
    {
        m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/
        for(x=1; x<m; x++) printf(" ");
        printf("*"); /*控制打印左侧的 * 号*/
        for(; x<62-m; x++)printf(" ");
        printf("*\n"); /*控制打印同一行中对称的右侧*号*/
    }

}

兔子数量问题

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

/*
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
*/
void numRabbit()
{
    // 月份
    int month = 0;
    while(cin >> month)
    {
        // 分别是三个月份大的兔子数量
        int m1 = 1, m2 = 0, m3 = 0;
        while(--month)
        {
            // 三个月大的兔子等于原来的加上两个月大的
            m3 = m3 + m2;
            // 两个月大的由一个月份大的提供
            m2 = m1;
            // 每月会生产新兔子
            m1 = m3;
        }
        // 三个加起来
        cout << m1 + m2 + m3 << endl;
    }
}

快速排序问题

快速排序(Quicksort),计算机科学词汇,适用领域Pascal,c++等语言,是对冒泡排序算法的一种改进。

速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

关键点
将第一个元素放到中间的位置,使得左边都小于它,右边都大于它
第一个元素的左边和右边,按照步骤一递归

在这里插入图片描述

//***********************************快速排序****************************************************
void quickSort(int arr[], int begin, int end) {
	if (begin >= end) return;
	int left = begin;
	int right = end;
	int temp = arr[left];

	while (left < right) {
		//从后往前找比他小的放前面,从前往后找比它大的放后面
		//以第一个数为基准,必须先从后往前走,再从前往后走
		while (left < right && arr[right] >= temp) {
			right--;
		}  //跳出此循环,代表right找到了比temp小的数字,所以此时arr[left]=arr[right]
		if (left < right) {
			arr[left] = arr[right];
		}
		while (left < right && arr[left] <= temp) {
			left++;
		}//同理
		if (left < right) {
			arr[right] = arr[left];
		}
		if (left == right) {
			arr[left] = temp;
		}
	}
	quickSort(arr, begin, left - 1);
	quickSort(arr, left + 1, end);
}

void runQuickSort()
{
    int arr[11] = { 5,6,3,2,7,8,9,1,4,0,0 };
	quickSort(arr, 0, 10);
	for (auto x : arr) {
		cout << x << " ";
	}
}

函数运行

//************************主函数******************************
int main()
    {

        //subRun(); //大数减法
        drawCos(); //绘制余弦曲线
        //numRabbit();//兔子的数量
        runQuickSort(); // 快速排序

        return 0;
    }

全部源码

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

using namespace std;

//************************大数减法******************************

bool cmp(vector<int> &A,vector<int> &B)
{
    if(A.size()!=B.size())
    {
        return A.size()>B.size();
    }
    for(int i = A.size(); i>=0; i--) //A,B长度相同
    {
        if(A[i]!=B[i])
        {
            return A[i]>B[i];
        }
    }
    return true;
}

vector<int> sub(vector<int> &A,vector<int> &B) //C=A-B
{
    int t = 0;//借位
    vector<int> C;
    for(int i = 0; i<A.size(); i++)
    {
        t = A[i]-t;
        if(i<B.size())
        {
            t-=B[i];
        }
        C.push_back((t+10)%10);
        if(t<0)
        {
            t = 1;
        }
        else
        {
            t = 0;
        }
    }
    while(C.size()>1&&C.back()==0) //去除多余前导0
    {
        C.pop_back();              //同时要注意A-B=0时不能把去除掉
    }
    return C;
}

void subRun() //求A-B
{
    string a,b;
    vector<int> A,B,C;
    cin>>a>>b;
    for(int i = a.size()-1; i>=0; i--)
    {
        A.push_back(a[i]-'0');//记得转为数字
    }
    for(int i = b.size()-1; i>=0; i--)
    {
        B.push_back(b[i]-'0');
    }
    if(cmp(A,B)) //A>=B
    {
        C = sub(A,B);
        for(int i = C.size()-1; i>=0; i--)
        {
            cout<<C[i];
        }
    }
    else //A<B
    {
        C = sub(B,A);
        cout<<"-";
        for(int i = C.size()-1; i>=0; i--)
        {
            cout<<C[i];
        }
    }
}


//************************绘制余弦曲线******************************
void drawCos()
{
    double y;
    int x,m;
    for(y=1; y>=-1; y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/
    {
        m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/
        for(x=1; x<m; x++) printf(" ");
        printf("*"); /*控制打印左侧的 * 号*/
        for(; x<62-m; x++)printf(" ");
        printf("*\n"); /*控制打印同一行中对称的右侧*号*/
    }

}

/*
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
*/
void numRabbit()
{
    // 月份
    int month = 0;
    while(cin >> month)
    {
        // 分别是三个月份大的兔子数量
        int m1 = 1, m2 = 0, m3 = 0;
        while(--month)
        {
            // 三个月大的兔子等于原来的加上两个月大的
            m3 = m3 + m2;
            // 两个月大的由一个月份大的提供
            m2 = m1;
            // 每月会生产新兔子
            m1 = m3;
        }
        // 三个加起来
        cout << m1 + m2 + m3 << endl;
    }
}

//***********************************快速排序****************************************************
void quickSort(int arr[], int begin, int end) {
	if (begin >= end) return;
	int left = begin;
	int right = end;
	int temp = arr[left];

	while (left < right) {
		//从后往前找比他小的放前面,从前往后找比它大的放后面
		//以第一个数为基准,必须先从后往前走,再从前往后走
		while (left < right && arr[right] >= temp) {
			right--;
		}  //跳出此循环,代表right找到了比temp小的数字,所以此时arr[left]=arr[right]
		if (left < right) {
			arr[left] = arr[right];
		}
		while (left < right && arr[left] <= temp) {
			left++;
		}//同理
		if (left < right) {
			arr[right] = arr[left];
		}
		if (left == right) {
			arr[left] = temp;
		}
	}
	quickSort(arr, begin, left - 1);
	quickSort(arr, left + 1, end);
}

void runQuickSort()
{
    int arr[11] = { 5,6,3,2,7,8,9,1,4,0,0 };
	quickSort(arr, 0, 10);
	for (auto x : arr) {
		cout << x << " ";
	}
}

//************************主函数******************************
int main()
    {

        //subRun(); //大数减法
        drawCos(); //绘制余弦曲线
        //numRabbit();//兔子的数量
        runQuickSort(); // 快速排序

        return 0;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言程序设计易混、易错知识点(下篇)

有环的单向链表跟无环的单向链表不可能相交 -正确 有环的单向链表和无环的单向链表不能相交&#xff0c;因为当相交的时候&#xff0c;无环的单向链表也会被迫存在一个环&#xff0c;只不过这个环的”起点“可能不是原来单向链表的头结点 如果两个单向链表相交&#xff0c;那这…

Vmware Pro 17 设置共享文件夹

目录 一、概述 二、在VMware设置共享文件夹详细步骤 一、概述 VMware 是运行在Windows系统上的&#xff0c;很多时候需要将 Windows 系统上的资料或代码复制到运行在VMware上的虚拟机&#xff0c;通常有两种方法可以完成复制&#xff0c;一个是在Vmware软件上设置共享文件夹&…

网络分层模型和应用协议

网络分层模型和应用协议 分层模型 分层模型的意义 当遇到一个复杂问题的时候&#xff0c;可以使用分层的思想把问题简单化。 比如&#xff0c; 你有一杯82年的可乐&#xff0c;想要分享给你的朋友张富贵&#xff0c;但你们已经很久没有联系&#xff0c;要完成这件事&#xf…

《深入浅出计算机组成原理》学习笔记 Day2

文章目录指令篇1. 从高级语言到机器指令1.1 CPU的作用1.2 代码如何变为机器码1.3 指令的分类2. 指令跳转2.1 CPU 是如何执行指令2.2 条件和循环的本质3. 函数调用3.1 栈的作用3.2 Stack Overflow指令篇 1. 从高级语言到机器指令 计算机或者说CPU本身并没有能力去理解这些高级…

配置远程服务器时候sftp的配置以及注意事项【在本地配置sftp】

我之所以不用PutTy是因为这个工具有问题&#xff0c;在我的电脑上怎么也安装不上&#xff0c;也找了很多办法根本没用。如这个 我试过修改权限以及各种安装办法连安装都不行。 所以才决定直接使用vscode自带的上传工具上传到服务器。 想要上传到服务器&#xff0c;需要使用vsc…

2023牛客寒假算法基础集训营1 -- G-鸡格线(map + 内置二分写法)

题目如下&#xff1a; 示例1 输入 3 5 0 2 114514 2 1 1 2 2 2 1 1 3 1 2输出 114516 114551 3445思路 or 题解&#xff1a; 通过 f(x)round(10∗x)f(x) round(10*\sqrt{x})f(x)round(10∗x​) 我们可得到&#xff1a; 经过至多 111111 次 0 -> 01~99 -> 99100 ~ i…

如何利用jar命令把前端代码打进jar包

目录背景介绍简单介绍几个常用的jar命令参数查询一个文件在jar包中的位置将文件解压到当前目录把一个目录打包进jar把一个文件打包进jar更新jar的shell脚本update.sh命令执行过程部分截图背景介绍 前后端分离是目前主流的开发模式&#xff0c;部署的时候也是利用类似nginx实现…

C++之多态

文章目录一、多态的理解二、多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写/覆盖4. C11 的 override 和 final5.重载、重写/覆盖、隐藏/重定义三、抽象类四、多态的原理1.虚函数表2.多态的原理3.动态绑定与静态绑定五、单继承和多继承关系的虚函数表1.单继承中的虚函…

【Git】IDEA 集成 Git

7、IDEA 集成 Git 7.1、配置 Git 忽略文件 1、Eclipse 特定文件 2、IDEA 特定文件 3、Maven 工程的 target 目录 问题 1:为什么要忽略他们&#xff1f; 答&#xff1a;与项目的实际功能无关&#xff0c;不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。 …

联合变换相关器摄远物镜光学设计

联合变换相关器摄远物镜光学设计 联合变换相关器工作原理 随着科学技术的飞速发展&#xff0c;光学相关探测器件由最初的匹配滤波器发展到今天的联合变换相关器&#xff0c;联合变换相关器与范得耳-卢格特相关器相比&#xff0c;具有灵活性好、识别精度高等特点&#xff0c;所…

Media基础知识一

1.视频文件是什么&#xff1f; FLV, MKV, MP4是不同的视频后缀名&#xff0c;不同的视频格式就像一个容器。容器里封装的是音视频流。 FFmpeg&#xff1a;一款开源软件&#xff0c;用来处理音视频&#xff0c;对音视频进行编解码。要在Android中使用FFmpeg&#xff0c;需要下载…

vue-element-admin 换肤功能,登录后不同权限不同皮肤,刷新不会失效

一、拉vue-element-admin的代码跑起来 安装依赖时会遇到一些问题&#xff0c;tui-editor装不上&#xff0c;需要按照以下步骤删除它 1、vue-element-admin\package.json 删除‘tui-editor’&#xff1a;‘1.3.3’依赖项。 2、vue-element-admin\src\components 删除MarkdownE…

C++ 三种智能指针及其设计实现unique_ptr、 share_ptr 指针

0、差不多春节啦。。。。。 好久没有写博客&#xff0c;写一写吧。。。。。。 祝大家嗨皮&#xff0c;提前恭喜发财 1、三种智能指针的使用方法 C 有3种指针&#xff1a;share_ptr, unique_ptr, weak_ptr 1.1&#xff09;unique_ptr 指针 std::unique_ptr 是一种独占的智能指…

Sklearn标准化和归一化方法汇总(1):标准化 / 标准差归一化 / Z-Score归一化

Sklearn中与特征缩放有关的五个函数和类&#xff0c;全部位于sklearn.preprocessing包内。作为一个系列文章&#xff0c;我们将逐一讲解Sklearn中提供的标准化和归一化方法&#xff0c;以下是本系列已发布的文章列表&#xff1a; Sklearn标准化和归一化方法汇总(1)&#xff1a…

ESP32 (WIFI)-AP、STA模式(13)

提示&#xff1a;本博客作为学习笔记&#xff0c;有错误的地方希望指正 文章目录一、ESP32 WIFI模式概述二、ESP32 WIFI-AP初始化流程三、WIFI-AP示例四、ESP32 WIFI-STA初始化流程五、WIFI-STA示例一、ESP32 WIFI模式概述 参考资料&#xff1a;ESP IDF编程手册V4.4   WIFI主…

【GD32F427开发板试用】Systick系统定时器的使用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;HonestQiao 基于Arm Cortex-M系列内核的MCU&#xff0c;都包含了SysTick定时器。 所谓SysTick即为系统定时器&#xff0c;又称嘀嗒定时器&am…

Docker Swarm

Swarm 是什么&#xff1f; Docker Swarm 是Docker官方的跨节点的容器编排工具。用户只需要在单一的管理节点上操作&#xff0c;即可管理集群下的所有节点和容器。 主要解决什么问题 1. 解决docker server的集群化管理和部署。 2. Swarm通过对Docker宿主机上添加的标签信息来…

分享60个PHP源码,总有一款适合您

PHP源码 分享60个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 60个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1SvjbzolwuMrQyhVb_byG5Q?pwdx831 提取码&#xff…

生物素点击标记试剂:DBCO-SS-PEG3-biotin,1430408-09-5,生物素PEG3二硫键DBCO

1、理论分析&#xff1a;中文名&#xff1a;生物素-三聚乙二醇-二硫-二苯并环辛炔&#xff0c;生物素-PEG3-二硫-DBCO &#xff0c;生物素PEG3-二硫二苯并环辛炔英文名&#xff1a;DBCO-S-S-PEG3-biotin&#xff0c;Biotin-PEG3-SS-DBCOCAS号&#xff1a;1430408-09-5化学式&am…

如何使用ArcGIS进行点抽稀

01 概述对于制图工作者而言&#xff0c;遇到大量的点要素&#xff08;POI、村名等&#xff09;标注的时候往往非常的麻烦&#xff0c;因为这些点往往都是十分的密集&#xff0c;直接标注很影响制图的美观。如果直接去处理原始的数据&#xff0c;会导致后续的数据更新维护麻烦&a…