话不多说,直接上代码!!!
一、大整数加减法
#include <iostream>
#include <string>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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<len2;i++)
{
for(j=0;j<len1;j++)
ab[i+j]+=anum[i] * bnum[j]; //相乘算结果
}
for(i = 0;i < 200;i ++)
{
//处理相加大于10的情况
if(ab[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<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<vector>
#include<climits>
using namespace std;
typedef struct node{ //为Point容器定义一个叫node的结构体,用来存放每个点对的横坐标和纵坐标
int x,y;
}Point;
vector <Point> 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<Point>&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<Point>&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 <Point> 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("%.2lf\n", mergesolution(P, 0, n - 1)); //输出最近点对距离,且为两位小数
}
以上就是本次分享的全部内容啦!希望大家能多多点赞收藏啊!!!