话不多说,直接上代码!!!
一、大整数加减法#include二、大整数乘法(C语言实现)#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; }
#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)); //输出最近点对距离,且为两位小数 }
以上就是本次分享的全部内容啦!希望大家能多多点赞收藏啊!!!



