【算法:1】高精度除法

高精度除法,我用高精度减法来模拟

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>

using namespace std;

inline int read()
{
    int x=0,f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch==‘-‘) f=-1;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘;
    return x*f;
}

const int maxn=10000;

int a[maxn],b[maxn],c[maxn];

void in(int a[]) //这个函数用来输入,输入时将字符串转化为int数组,角标为0的为长度。并倒序存储。
{
    string s;
    cin>>s;
    a[0]=s.length();
    for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-‘0‘;
    return ;
}

void print(int a[]) // 输出
{
    if( !a[0] ) puts("0");
    else
    {
        for(int i=a[0];i>0;i--) printf("%d",a[i]);
        puts("");
    }
    return ;
}

int compare( int a[], int b[]) // 比较函数,如果a<b,返回-1,如果a>b,返回1,如果a=b,返回0
{
    if( a[0] > b[0] ) return 1;
    if( a[0] < b[0] ) return -1;
    for(int i=a[0];i>0;i--)
    {
        if(a[i] > b[i]) return 1;
        else if( a[i] < b[i] ) return -1;
    }
    return 0;
}

void sub(int a[], int b[])//高精度减法
{
    int flag=compare(a,b);
    if( !flag) {a[0]=0;return ;}
    if( flag == 1 )
    {
        for(int i=1;i<=a[0];i++)
        {
            if( a[i] < b[i] )
            {
                a[i+1]--;
                a[i]+=10;
            }
            a[i]-=b[i];
        }
        while( a[0] > 0 && !a[a[0]] ) a[0]--;
    }
    return ;
}

void numcpy(int p[], int q[],int det) //复制p数组到q数组从det开始的地方
{
    for(int i=1;i<=p[0];i++) q[i+det-1]=p[i];
    q[0]=p[0]+det-1;
    return ;
}

void div(int a[], int b[], int c[])
{
    int tmp[maxn];
    c[0]=a[0]-b[0]+1;
    for(int i=c[0];i>0;i--)
    {
        memset(tmp,0,sizeof(tmp));
        numcpy(b,tmp,i);
        while( compare(a,tmp) >= 0) {c[i]++;sub(a,tmp);} //用减法模拟除法
    }
    while(c[0] > 0 && !c[c[0]]) c[0]--;
    return ;
}

int main()
{
    in(a),in(b),div(a,b,c),print(c),print(a);
}
时间: 2024-11-07 16:03:02

【算法:1】高精度除法的相关文章

【算法学习笔记】34.高精度除法 SJTU OJ 1026/1016

高精度除法, 这个和加减乘一样,我们都要从手算的角度入手.举一个例子,比如 524134 除以 123.结果是4261 第一位4的来源是 我们把 524和123对齐,然后进行循环减法,循环了4次,余32,将32134的前三位321继续和123对齐,循环减法2次,余75,把7534的前三位753和123对齐,循环减法6次,余15,将154和123对齐,只能减1次,所以结果是4 2 6 1. 把上述过程程序化 1.把A,B两个数存入char数组 0下标表示的是最高位2.把A的前lenB位和B对齐进行

中石油-高精度除法-java版

问题 G: [高精度]高精度数除以低精度数I 时间限制: 1 Sec  内存限制: 512 MB提交: 19  解决: 15[提交][状态][讨论版] 题目描述 修罗王聚集了庞大的暗元素以施展隐匿魔法,该魔法施展后将对其周边的时空产生隐匿效果,当然,隐匿的效果好坏取决于是否将暗元素平均地分配在其周边时空,显然这涉及高精度除法的编程.考虑到邪狼的理解能力,修罗王不得不先将问题简化为:输入一被除数(位数≤5000),输入一除数(整型数据范围内),输出整数商,忽略小数. 输入 共两行,第1行为一个数字

poj 2635 The Embarrassed Cryptographer 筛素数+高精度除法

题意: 给K(<10^100),L(<10^6),求K小于L的最小素因子并输出,如果没有则输出GOOD. 分析: 枚举小于L的素数用高精度除法判断是否是因子,关键是怎么高效筛素数,先给一种比较慢的筛法: primes[max_prime_num],num=0; memset(vis,0,sizeof(vis)) for(int i=2;i<maxL;++i) if(vis[i]==0){ prime[num++]=i; for(int j=2*i;j<maxL;j+=i) vis[

POJ 2325 Persistent Numbers#贪心+高精度除法

(- ̄▽ ̄)-* 这道题涉及高精度除法,模板如下: char s[1005]; char division[1005];//存储进行高精度除法的数据 bool bignum_div(int x) { int tot=0,num=0; for(int i=0;s[i];i++) { num=num*10+s[i]-'0'; division[tot++]=num/x+'0'; num%=x; } division[tot]='\0';//利于进行strcpy() if(num==0) //有适合的

使用java求高精度除法,要求保留N位小数

题目要求是高精度除法,要求保留N位小数(四舍五入),并且当整数部分为0时去除0的显示 1 import java.math.BigDecimal; 2 import java.util.Scanner; 3 4 public class BD 5 { 6 public static void main(String[] args) 7 { 8 Scanner scanner = new Scanner(System.in); 9 while(scanner.hasNext()) 10 { 11

高精度除法(大数相除)

高精度除法(高除高) #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int a[101],b[101],c[101],d,i; void shuru(int a[]) { string s; cin>>s; //读入字符串 a[0]=s.length(); //a[0

[结论][高精度除法]JZOJ 3771 小Z的烦恼

Description 小 Z 最近遇上了大麻烦,他的数学分析挂科了.于是他只好找数分老师求情. 善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1-n 的球和 m 个盒子,每个球都可以放进且只能放进一个盒子里面,但是要满足如下的规则: 1.  若把标号为 i 的球放进了第 j 个盒子,那么标号为 2*i 的球一定要在第 j+1 个盒子里面(若 j<m) 2.  若把标号为 i 的球放进了第 j 个盒子,并且 k*2=i,那么标号为 k 的球一

AcWing 794.高精度除法

AcWing 794.高精度除法 题目描述 给定两个正整数A,B,请你计算 A / B的商和余数. 输入格式 共两行,第一行包含整数A,第二行包含整数B. 输出格式 共两行,第一行输出所求的商,第二行输出所求余数. 数据范围 1≤A的长度≤100000, 1≤B≤10000 输入样例 7 2 输出样例 3 1 题目思路 低角标存低位,高角标存高位:按位依次向后除,A[i]除整个b,余数进位 #include<iostream> #include<string> #include&l

【练习赛2补题】poj 2325 Persistent Numbers 【高精度除法+贪心】

Description The multiplicative persistence of a number is defined by Neil Sloane (Neil J.A. Sloane in The Persistence of a Number published in Journal of Recreational Mathematics 6, 1973, pp. 97-98., 1973) as the number of steps to reach a one-digit