高精除以高精

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 高精除以高精

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

【算法分析】

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

高精除以高精则是用减法模拟除法,对被除数的每一位都减去除数,一直减当前位置的数字(包含前面的余数)小于除数(由于每一位的数字小于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. }

 

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
L1-046 整除光棍(高精除的处理)
L1-046 整除光棍(高精除的处理)
84 0
|
编解码 Java BI
10米精度NPP净初级生产力数据/NDVI数据/植被类型数据/土地利用数据/降雨气温分布数据/太阳辐射分布数据
10米精度NPP净初级生产力数据/NDVI数据/植被类型数据/土地利用数据/降雨气温分布数据/太阳辐射分布数据
10米精度NPP净初级生产力数据/NDVI数据/植被类型数据/土地利用数据/降雨气温分布数据/太阳辐射分布数据
|
BI 定位技术
全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据
全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据
全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据
|
机器学习/深度学习
Google Earth Engine ——2001-2017年非洲土壤深度 0-20 厘米和 20-50 厘米的可提取铁,预测平均值和标准偏差数据集
Google Earth Engine ——2001-2017年非洲土壤深度 0-20 厘米和 20-50 厘米的可提取铁,预测平均值和标准偏差数据集
115 1
Google Earth Engine ——2001-2017年非洲土壤深度 0-20 厘米和 20-50 厘米的可提取铁,预测平均值和标准偏差数据集
|
机器学习/深度学习
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的石含量数据,预测平均值和标准偏差
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的石含量数据,预测平均值和标准偏差
147 0
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的石含量数据,预测平均值和标准偏差
|
机器学习/深度学习
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的淤泥含量数据,预测平均值和标准偏差
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的淤泥含量数据,预测平均值和标准偏差
117 0
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的淤泥含量数据,预测平均值和标准偏差
|
机器学习/深度学习
Google Earth Engine ——2001-2017年非洲土壤在土壤深度 0-20 厘米和 20-50 厘米的可提取锌,预测平均值和标准偏差数据
Google Earth Engine ——2001-2017年非洲土壤在土壤深度 0-20 厘米和 20-50 厘米的可提取锌,预测平均值和标准偏差数据
107 0
Google Earth Engine ——2001-2017年非洲土壤在土壤深度 0-20 厘米和 20-50 厘米的可提取锌,预测平均值和标准偏差数据
|
机器学习/深度学习
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的钾数据,预测平均值和标准偏差
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的钾数据,预测平均值和标准偏差
127 0
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的钾数据,预测平均值和标准偏差
|
机器学习/深度学习
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的含砂量数据,预测平均值和标准偏差
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的含砂量数据,预测平均值和标准偏差
118 0
Google Earth Engine ——2001-2017年非洲土壤在 0-20 厘米和 20-50 厘米的土壤深度处可提取的含砂量数据,预测平均值和标准偏差

热门文章

最新文章

下一篇
开通oss服务