高精除以高精

简介: 高精除以高精

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

【算法分析】

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

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

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
【Simulink】使用Model Explorer设置模块变量初值
【Simulink】使用Model Explorer设置模块变量初值
1342 0
|
安全 网络安全 数据安全/隐私保护
FileZilla搭建FTP服务器图解教程
在日常办公当中,经常会需要一个共享文件夹来存放一些大家共享的资料,为了保证文件数据的安全,最佳的方式是公司内部服务器搭建FTP服务器,然后分配多个用户给相应的人员。今天给大家分享FileZilla搭建FTP服务器图解教程,希望对大家有所帮助!
FileZilla搭建FTP服务器图解教程
|
7月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
9月前
|
人工智能 运维 Prometheus
别等系统“炸了”才慌!聊聊AI搞运维故障检测的那些真香时刻
别等系统“炸了”才慌!聊聊AI搞运维故障检测的那些真香时刻
417 0
|
8月前
|
程序员 编译器 C#
C#语言中使用"using"关键字的介绍
以上就是 C# 中 "using" 关键字的主要用法。了解并熟练应用这个关键字,对于提高代码质量、解决命名冲突、管理资源都有着重要的作用。它是 C# 编程中不可或缺的一部分,无论是对初学者还是有经验的开发者而言,掌握它都是提高编写高效、清晰、可维护代码的关键。
282 7
|
网络协议 Unix 应用服务中间件
Supervisor安装与配置
Supervisor安装与配置
1019 1
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
863 1
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
小程序 PHP Perl
vscode设置php自定义注释格式
写代码一般的注释都是有格式的,方便自己和他人阅读代码,多人开发的时候,也能更快的找到这部分代码是由谁来编写的。 好的代码注释确实是一个好习惯,但是,有的时候就是这玩意有敲起来有点费劲~
577 0
|
弹性计算 网络安全 数据中心
阿里云VPC创建专有网络10、172和196网段选择注意事项
阿里云VPC创建专有网络10、172和196网段选择注意事项,阿里云专有网络VPC私网网段可选192.168.0.0/16、172.16.0.0/12或10.0.0.0/8,如何选择?阿里云百科来详细说下阿里云专有网络IPv4网段选择方法:
717 0
阿里云VPC创建专有网络10、172和196网段选择注意事项
|
关系型数据库 MySQL Linux
亲测!Centos7 部署 PHP + Swoole
由于新的项目需求,需要搭建PHP+swoole的环境,官网上的文档主要是以最新版的环境为主,测试很多次之后没法安装成功,也在一些博客网站上找了很多教程,要不完整,要么版本不对或者版本过老,走过很多弯路才安装好,为了让各位童鞋少走弯路,特此写下自己的安装和配置流程。以供参考! 接下来,进入主题:
1198 1