高精度除法(大数相除)

高精度除法(高除高)

#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]储存字符串的长度
    for (i=1;i<=a[0];i++)
        a[i]=s[a[0]-i]-‘0‘;   //将字符串转化为数组a,并倒序储存,模拟竖式计算
}
void shuchu(int a[])// 用于输出最后的答案,并注意若答案为0的情况
{
    int i;
    if (a[0]==0) {cout<<"0"<<endl;return;}
    for (i=a[0];i>0;i--) cout<<a[i];
    cout<<endl;
    return;
}
int bijiao(int a[],int b[])//比较a和b的大小关系,若a>b则为1,若a<b则为-1,若a=b则为0
{
    int i;
    if (a[0]>b[0]) return 1;  //若a的位数大于b,则a>b
    if (a[0]<b[0]) return -1;  //若a的位数小于b,则a<b
    for (i=a[0];i>0;i--){if (a[i]>b[i]) return 1;if (a[i]<b[i]) return -1;} //从高位到低位依次比较,找出大小关系
    return 0;
}
void jian(int a[],int b[])  //a数组既做被除数,又作为储存余数
{
    int pd;
    int i;
    pd=bijiao(a,b);            //调用函数比较ab大小
    if (pd==0) {a[0]=0;return;}  //相等
    if (pd==1)
    {
        for (i=1;i<=a[0];i++)
        {
            if (a[i]<b[i]) {a[i+1]--;a[i]+=10;}   //若不够减向上一位借一位
            if (a[i]>=b[i])  a[i]-=b[i];
        }
        while((a[a[0]]==0)&&(a[0]>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数组储存右移后的结果
    q[0]=p[0]+det-1;
}
void chugao(int a[],int b[],int c[])
{
    int i,tmp[101];
    c[0]=a[0]-b[0]+1;
    for (i=c[0];i>0;i--)
    {
        memset(tmp,0,sizeof(tmp));     //tmp数组清零
        numcpy(b,tmp,i);               //将除数b右移后复制给tmp数组,注意用i控制除数位数
        while (bijiao(a,tmp)>=0){c[i]++;jian(a,tmp);}   //减法模拟除法,并计数
    }
    while((c[c[0]]==0)&&(c[0]>0)) c[0]--;   // 控制最高位的0
}
int main()//主程序
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    shuru(a);shuru(b);
    chugao(a,b,c);
    shuchu(c);
    shuchu(a);
    return 0;
}

第一次写博,也意味着正式步入oi界,成为光荣的OIer,不忘初心,加油!

3月19自主招生通过

4月19一中报道,开始学习编程

5月10日开博

oi我来了


        zhhe0101写于2016年5月10日,一个平凡又不平凡的夜晚。
时间: 2024-11-11 21:41:01

高精度除法(大数相除)的相关文章

高精度之大数除法

大数除法说的比较少或许不像加法减法那样简单,或许是用的不太多.到底怎么我也不知道. 反正你会了加法减法,乘法而不会除法,就像是,打开电脑而不玩游戏,心里难受. 我是从看到了大神博客后学习了一下. http://blog.csdn.net/hitwhylz/article/details/9700935 博客中讲的很详细 让人一看就懂,我很佩服这位同学.果断的关注了. 毕竟别人写的是别人的. 自己写的才是自己的 .于是我就捋了捋,模仿这写了一遍: 思想就是:用减法来代替除法,但是一次一次的减太慢,

【算法学习笔记】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对齐进行

【算法: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();

高精度之大数乘小数

今天下载百度文库资料时发现了 发现了内蒙古电子信息学院的ACM模板. 打开看了一下刚开始就是高精度的计算问题. 于是我就写了写.说实话在我的心里对这些东西有点抵触.因为接触的时候没能很好的掌握所以以后遇到这样的问题总是逃避,虽然逼着自己也能写出来,但是就是不愿意去写. 今天看到一个人的博客让我受益很深.其实不是内容,当然内容也很好.让我感觉到,其实厉害的人不是有多大的成就,会多少别人听都没听过的知识,把一件小事情做好,做的自己满意这就是成功. 闲话不扯了,我们来说一下高精度乘法问题. 大数乘小数

中石油-高精度除法-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

华为机试—大数相减

题目:大数相减 输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果. 备注:1.两个整数都是正整数,被减数大于减数 示例: 输入:1000000000000001       1 输出:1000000000000000 #include <stdio.h> #include <string.h> #define MAX 100 //100位大数相减 int bigNumSub(char a[],char b[],char sub[]) { int i=0