栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

算法设计与分析:C++实现大整数加减法、大整数乘法、最近点对问题(通俗易懂,上手快)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法设计与分析:C++实现大整数加减法、大整数乘法、最近点对问题(通俗易懂,上手快)

话不多说,直接上代码!!!

一、大整数加减法
#include 
#include 
using namespace std;

//输入两个字符串形式的非负大整数x和y,计算它们的和或差
class Solveaddsub
{
    public:
    string add(string x, string y)  //大整数加法
    {
           //当x位数大于y时
        if(x.size() < y.size())
       {
           swap(x,y);  //交换x,y
       }
        string ret(x.size() + 1, '0');
        char step = 0;
        for(int il = x.size() - 1, ir = y.size() - 1; il >= 0; il--, ir--)
        {
            char ch = x[il] - '0' + step;
            if(ir >= 0)
            {
                ch += y[ir] - '0';
            }
            step = 0;
            if(ch >= 10)
            {
                step = 1;
                ch -= 10;
            }
            ret[il + 1] += ch;
        }
        if(step == 1)
        {
            ret[0] += step;
        }
        else
        {
            ret.erase(ret.begin());
        }
        return ret;
    }

    string sub(string x, string y)   // 大整数减法
    {
             //当x位数小于y时
        if(x.size() < y.size())
        {
           swap(x,y);  //交换x,y
        }
        string ret(x.size(), '0');
        char step = 0;
        for(int il = x.size() - 1, ir = y.size() - 1; il >= 0; il--, ir--)
        {
            char ch = x[il] - '0' - step;
            step = 0;
            if(ir >= 0)
            {
				if((x[il] - '0') < (y[ir] - '0'))
                {
                    step = 1;
                    ch += 10;
                }
                ch -= y[ir] - '0';
            }
            if(ir < 0 && ch < 0)
            {
                step = 1;
                ch += 10;
            }
            ret[il] += ch;
        }
        if(step == 1)
        {
            ret[0] -= 1;
        }
        while (ret[0] == '0')
        {
            ret.erase(ret.begin());
        }
        return ret;
    }
};
int main()
{
    string a,b,m;
    Solveaddsub s;
    cin >> a >> m >> b;  //其中m是+或-,a和b是两个大整数
    if(m == "+")
      cout << "结果:" << s.add(a,b) << endl;
    else if(m == "-")
    {
        if(a > b)
        cout << "结果:" << s.sub(a,b) << endl;
        else
        cout << "结果:" << s.sub(b,a) << endl;
    }
    else
       cout << "error";
    return 0;
}
二、大整数乘法(C语言实现)

#include 
#include 
#include 

char a[256], b[256];    //把大整数a和b用字符型的数组来定义
int anum[256], bnum[256], ab[5000];   //anum为大整数a的数字型,bnum为大整数b的数字型,ab为它们的乘积数字型;
int main()
{
    gets(a); //得到大整数a
    gets(b);    //得到大整数b
    int len1 = strlen(a);    //获取大整数a的长度
    int len2 = strlen(b);    //获取大整数b的长度
    int j;
    int i = 0;
    for(j = len1 - 1; j >= 0; j--)
    {
        anum[i] = a[j] - '0';   //获取大整数a中第j位上的数字,作为anum数组的第i+1个
        i++;
    }
    i = 0;
    for(j = len2 - 1;j >= 0; j--)
    {
        bnum[i] = b[j] - '0';    //获取大整数b中第j位上的数字,作为bnum数组的第i+1个
        i++;
    }
    for(i=0;i= 10)
        {
            ab[i+1]=ab[i+1]+ab[i]/10;
            ab[i]=ab[i]%10;
        }
    }
    printf("结果:");
    int flag;   //设置一个Flag,从ab[]的较大的下标位开始循环,遇到非0的数才打印,实现去除前导零的步骤。
    flag = 0;
	for(i = 200; i >= 0; i --)
		if(flag)
			printf("%d", ab[i]);
		else if(ab[i]) {
			printf("%d", ab[i]);
			flag = 1;
		}
	if(!flag )
		printf("0");
	return 0;
}
 三、最近点对问题
#include
#include
#include
#include
#include
#include
using namespace std;

typedef struct node{  //为Point容器定义一个叫node的结构体,用来存放每个点对的横坐标和纵坐标
	int x,y;
}Point;

vector  T(300000); // 声明一个叫Point的且容量为300000的动态数组(容器)

double dist(Point p1, Point p2)   //p1,p2是两个点对,求它们之间的距离
{
	return sqrt((double)(p1.x - p2.x)*(p1.x - p2.x)+(double)(p1.y - p2.y)*(p1.y - p2.y));
}

bool comparex(Point a,Point b) //sort()里点对横坐标的比较函数,对x进行升序排序,若x相同则依照y进行升序排序
{
	if (a.x == b.x)
		return a.y < b.y;
	return a.x < b.x;
}

bool comparey(Point a,Point b)    //sort()里点对纵坐标的比较函数,对y进行排序
{
	return a.y < b.y;
}

double Merge(vector&P, int low, int mid, int high, double d)   //分治法求最近点对,其中参数是点对的数组,low,high两个指针用来标记
{
	int i,j,k=0;
	for (i = low; i <= high; i++){
		if(fabs(1.0 * P[mid].x - 1.0 * P[i].x) < d)
			T[k++] = P[i];   // k是T的大小
	}
	sort(T.begin(), T.begin() + k, comparey);  //进行排序
	double mind = d;
	for (i = 0; i < k - 1; i++){               //边界是k-1
		for (j = i + 1; j < min(i + 7, k); j++){
			if (dist(T[i], T[j]) < mind)
				mind = dist(T[i], T[j]);
		}
	}
	return mind;
}

double mergesolution(vector&P, int low, int high) //合并
{
	if (low >= high) return (double)INT_MAX;// 如果自己与自己的距离最近,那直接输出距离为0.00
	if (low + 1 == high) // 这两点中间没有任何点,所以直接求距离
		return dist(P[low], P[high]);
	int mid = (high + low) / 2;    //求出mid
	double d = min(mergesolution(P, low, mid), mergesolution(P, mid + 1, high));// 分别获得两分区中最近点对距离,并取这两个距离之中的较小值
	return Merge(P, low, mid, high, d);
}

int main(){
	int n,i;
	scanf("%d",&n);     //输入点对数
	vector  P(n); //定义一个在Point容器里面叫P的数组来储存x和y
	for (i = 0; i < n; i++)
		scanf("%d,%d", &P[i].x, &P[i].y);  //调用结构体来输入x,y,其中x是点对的横坐标,y是点对的纵坐标
	sort(P.begin(), P.begin() + n, comparex); //开始进行分治,其中P.begin()用来返回P数组第一个数的地址
	printf("%.2lfn", mergesolution(P, 0, n - 1)); //输出最近点对距离,且为两位小数
}

以上就是本次分享的全部内容啦!希望大家能多多点赞收藏啊!!! 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035053.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号