高精除以高精

简介: 高精除以高精

高精除以高精,求它们的商和余数。

【算法分析】

高精除以低精是对被除数的每一位(这里的“一位”包含前面的余数,以下都是如此)都除以除数。

高精除以高精则是用减法模拟除法,对被除数的每一位都减去除数,一直减当前位置的数字(包含前面的余数)小于除数(由于每一位的数字小于10,所以对于每一位最多进行10次计算),具体实现< 方法一 >:

1. #include<iostream>
2. #include<cstring>
3. using namespace std;
4. int a[101],b[101],c[101],d,i;
5. void init(int a[]){//获取字符串 并将字符串逆向存储转换为数组  
6.  string s;
7.  cin>>s;
8.  a[0]=s.length();//a[0]储存字符串的长度 
9.  for(i=1;i<=a[0];i++)
10.     a[i]=s[a[0]-i]-'0';
11. }
12. void print(int a[]){//打印函数 逆向输出 
13.   if(a[0]==0) {
14.     cout<<0<<endl;
15.     return ;
16.   }
17.   for(int i=a[0];i>0;i--) cout<<a[i];
18.   cout<<endl;
19.   return ;
20. } 
21. int compare(int a[],int b[]){//比较函数 a>b返回1;a<b返回-1;a=b返回0
22.   if(a[0]>b[0]) return 1;
23.   if(a[0]<b[0]) return -1;
24.   for(int i=a[0];i>0;i--){//从高位向低位比较 
25.     if(a[i]>b[i]) return 1;
26.     if(a[i]<b[i]) return -1;
27.   }
28.   return 0;//每一位都相等 
29. } 
30. void jian(int a[],int b[]){
31.   int flag,i;
32.   flag=compare(a,b);
33.   if(flag==0) {a[0]=0;return;}
34.   if(flag==1){
35.     for(i=1;i<=a[0];i++){
36.       if(a[i]<b[i]){//处理借位 
37.         a[i+1]--;
38.         a[i]+=10;
39.       } 
40.       a[i]-=b[i];
41.     }
42.     while(a[0]>0&&a[a[0]]==0) a[0]--;//修正位数 
43.     return;
44.   }
45. }
46. void numcpy(int p[],int q[],int det){//将p数组拷贝到q数组中,从q的det位置开始 
47.   for(int i=1;i<=p[0];i++)q[i+det-1]=p[i];
48.   q[0]=p[0]+det-1;//更新q的位数 
49. }
50. void chu(int a[],int b[],int c[]){//除法运算函数 
51.   int i,tmp[101];
52.   c[0]=a[0]-b[0]+1;//确定商的位数 
53.   for(i=c[0];i>0;i--){
54.     memset(tmp,0,sizeof(tmp));
55.     numcpy(b,tmp,i);
56.     while(compare(a,tmp)>=0){//减法模拟除法运算过程 
57.       c[i]++;
58.       jian(a,tmp);  
59.     }
60.   }
61.   while(c[0]>0&&c[c[0]]==0) c[0]--;
62.   return ;
63. } 
64. int main()
65. {
66.   memset(a,0,sizeof(a));
67.   memset(b,0,sizeof(b));
68.   memset(c,0,sizeof(c));
69.   init(a);
70.   init(b);
71.   chu(a,b,c);
72.   print(c);
73.   print(a);
74.   return 0;
75. }

< 方法二 >:

1. #include <iostream>
2. #include <string.h>
3. #include <algorithm> 
4. using namespace std;
5. #define MAX 400
6. 
7. void IntToChar(int Arr[],char str[],int begin,int end){
8.  for(int i=begin;i<end;i++)  str[i]=Arr[i]+'0';  
9.  str[end]='\0';
10. }
11. void CharToInt(char str[],int Arr[]){
12.   int i=0;
13.   while(str[i]!='\0') Arr[i]=str[i++]-'0';
14. }
15. void swap(int &a,int &b){
16.   int t=a;a=b;b=t;
17. } 
18. void filterZero(char a[]){
19.   int l;
20.   while(a[0]=='0' && a[1]!='\0')  {
21.     l=strlen(a);
22.     for(int i=0;i<l;i++)  a[i]=a[i+1];
23.   }
24. }
25. void sub( char s1[], char s2[],char s3[])
26. {
27.   char a[MAX]={0},b[MAX]={0};
28.   int ia[MAX]={0},ib[MAX]={0},ic[MAX]={0};
29.   int size,la,lb;
30.   bool flag = false; //符号位
31.   filterZero(s1),filterZero(s2);
32.   la=strlen(s1),lb=strlen(s2);
33.   if(la<lb ||(la==lb && strcmp(s1,s2)<0)){
34.     flag = true;  //结果为负数
35.       strcpy(a,s2),strcpy(b,s1); //复制被减数和减数 
36.       swap(la,lb);
37.   }
38.   else  strcpy(a,s1),strcpy(b,s2); //复制被减数和减数 
39.   size = la>lb?la:lb;
40.   reverse(a,a+la),reverse(b,b+lb);
41.   CharToInt(a,ia);
42.   CharToInt(b,ib);
43.   //减法
44.   for(int i=0;i<size;i++){
45.     ic[i]+=ia[i]-ib[i];
46.     if(ic[i]<0){
47.       ic[i+1]--;
48.       ic[i]+=10;
49.     }
50.   }
51.   //输出
52.   bool bOut=false;
53.   int k=0;
54.   if(flag)  s3[k++]='-';
55.   for(int i=size;i>=0;i--){
56.     if(ic[i]) bOut = true;
57.     if(bOut) s3[k++]=ic[i]+'0';
58.   }
59.   //正好为0的情况
60.   if(k==0) s3[k++]='0'; 
61.   s3[k]='\0';
62. } 
63. int main(int argc, char *argv[])
64. {
65.   char a[MAX]={0},b[MAX]={0};
66.   int c[MAX]={0};
67.   char bcx[MAX],bk[MAX];
68.   int size,la,lb,k;
69.   cin>>a>>b;
70.   la=strlen(a),lb=strlen(b);
71.   //特殊情况不够除直接输出结果
72.   if(la<lb || (la==lb && strcmp(a,b)<0))
73.   {
74.     cout<<"0"<<endl<<a<<endl;
75.     return 0;
76.   } 
77.   size=la-lb+1; //确定除的次数 
78.   //除法模拟 
79.   for(int i=0;i<size;i++){
80.     if(i==0){
81.       strncpy(bcx,a,lb); //根据除数的长度确定开始的被除数 
82.       bcx[lb]='\0'; 
83.     } 
84.     else{
85.       k=strlen(bcx);
86.       bcx[k]=a[lb+i-1],bcx[k+1]='\0';
87.     }
88.     //尝试减法 
89.     k=0;
90.     sub(bcx,b,bk);  //bk为高精度减法结果数据 
91.     while(bk[0]!='-'){
92.       k++;
93.       strcpy(bcx,bk); //将减的结果更新为被减数 
94.       sub(bcx,b,bk);  //继续尝试减法 
95.     }
96.     c[i]=k; //保存结果
97.   }
98.   //输出商
99.   bool bOut=false;
100.  for(int i=0;i<size;i++){
101.    if(c[i]) bOut = true;
102.    if(bOut) cout<<c[i];
103.  }
104.  //输出余数 
105.  cout<<endl<<bcx<<endl;
106. 
107.  return 0;
108. }

 

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3天前
|
算法 调度
光学雨量计在城市雨水管理中具有重要的应用价值
光学雨量计在城市雨水管理中具有重要的应用价值
光学雨量计在城市雨水管理中具有重要的应用价值
|
3天前
|
JavaScript 定位技术
热力图模拟福岛排放核污染水到爆炸💥
热力图模拟福岛排放核污染水到爆炸💥
|
10月前
|
编解码 定位技术
GIS空间分析 数字地形分析2 基本地形因子的提取
在本文中,你将学习到如何利用DEM数据在ArcGIS中提取出坡度、坡向等地形因子。
183 0
|
10月前
1308:【例1.5】高精除
1308:【例1.5】高精除
|
10月前
L1-046 整除光棍(高精除的处理)
L1-046 整除光棍(高精除的处理)
43 0
|
10月前
|
传感器 存储 算法
使用车载激光雷达数据在惯性测量单元读数帮助下构建地图
处理来自安装在车辆上的传感器的 3-D 激光雷达数据,以便在惯性测量单元 (IMU) 读数的帮助下逐步构建地图。这样的地图可以促进车辆导航的路径规划,也可以用于定位。
64 0
|
10月前
|
监控 安全 数据可视化
uwb高精度定位系统:实现厘米级定位感知
1、工厂人员定位系统可实现物资/车辆实时定位,物资/车辆数量实时查询,全智能化的物资/车辆查找,提高工作效率,实现合理调度; 2、集人脸识别系统、智能考勤、工时统计、行为检测、历史轨迹回放、人员管理、电子围栏、应急救援等功能为一体,实现在岗人员及外来承包商的规范管理;
|
编解码 Java BI
高精度10m/30米NPP净初级生产力分布数据
高精度10m/30米NPP净初级生产力分布数据
高精度10m/30米NPP净初级生产力分布数据
|
编解码 Java BI
10米精度NPP净初级生产力数据/NDVI数据/植被类型数据/土地利用数据/降雨气温分布数据/太阳辐射分布数据
10米精度NPP净初级生产力数据/NDVI数据/植被类型数据/土地利用数据/降雨气温分布数据/太阳辐射分布数据
10米精度NPP净初级生产力数据/NDVI数据/植被类型数据/土地利用数据/降雨气温分布数据/太阳辐射分布数据
|
BI 定位技术
全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据
全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据
全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据