大数除法(lld最多19位)

大数除法的核心:把除法运算转化为减法运算,根据除法运算的特点,

有两个大整数a和b,当a==b时,a/b==1,余数是0。(a!=0,b!=0)

当a>b时,a/b>=1,余数需要通过计算求得。

当a<b时,a/b=0,余数就是a。

以7546除23为例。

先减去23的100倍,就是2300,可以减3次,余下646。   此时商就是300;

然后646减去23的10倍,就是230,可以减2次,余下186。此时商就是320;

然后186减去23,可以减8次,此时商就是328.

特例

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

#include<stdio.h>
#include<string.h>
int main(){
    char a[2000],q[2000];
    int  b,r,len,i,temp;
    r=0;
    scanf("%s",a);
    len=strlen(a);
    scanf("%d",&b);
    if(len==1&&a[0]-‘0‘<b){
        printf("0 %c",a[0]);
        return 0;
    }
    for(i=0;i<len;i++){
        temp=r*10+a[i]-‘0‘;
        q[i]=temp/b+‘0‘;
        r=temp%b;
    }
    i=0;
    while(q[i]==‘0‘)
        i++;
    for (; i < len; i++)
        printf("%c", q[i]);
    printf(" %d", r);
    return 0;
}

正常的大数除法

#include<stdio.h>
#include<string.h>
#define M 1000005
char s1[M],s2[M];
int a[M];
void ss(int m)//减运算
{
    int i=0,j;
    while(1)
    {
        if(s1[i]==‘0‘) i++;
        else
        {
            j=i;
            break;
        }
    }
    for(; i<m; i++)
        s1[i]=s1[i]-s2[i]+‘0‘;
    for(i=m-1; i>j; i--)
        if(s1[i]<‘0‘)
        {
            s1[i]+=10;;
            s1[i-1]--;
        }
}
int main()
{
    int i,j,k,n,m;
    while(~scanf("%s%s",s1,s2))
    {
        n=strlen(s1);
        m=strlen(s2);
        if(n<m||n==m&&strcmp(s1,s2)<0)//特殊情况判断
        {
            printf("0 余数=");//求余数
            for(i=0; i<n; i++)
                printf("%d",s1[i]-‘0‘);
            printf("\n");
            continue;
        }
        k=0;
        while(1)
        {
            a[k]=0;
            while(strcmp(s1,s2)>=0)//一直进行减法,直到不能减为止
            {
                ss(m);
                a[k]++;
            }
            k++;
            if(n==m)   break;
            for(i=m-1; i>=0; i--) //在s2前面补0,以便进行减法运算
                s2[i+1]=s2[i];
            s2[0]=‘0‘;
            m++;
            s2[m]=‘\0‘;//strcmp()函数遇到字符‘\0‘结束
        }
        i=0;
        while(a[i]==0) i++;//去除前导0
        for(; i<k; i++)
            printf("%d",a[i]);
        printf(" 余数=");
        j=0;//求余数
        while(s1[j]==‘0‘)  j++;
        if(j==n)
        {
            printf("0\n");
            continue;
        }
        for(; j<n; j++)
            printf("%d",s1[j]-‘0‘);
        printf("\n");
    }
    return 0;
}  

原文地址:https://www.cnblogs.com/leolaosao/p/9160886.html

时间: 2024-10-29 04:23:53

大数除法(lld最多19位)的相关文章

关于大数除法

最近在九度oj上看了几个关于大数的问题,特意在这里总结一番. 要知道我们要将一个1000多位的十进制数转换为二进制数,是没有哪个类型能装得下的,所以在这里我们的手动模拟辗转相除法.实现将一个很长的十进制数字符串转换成二进制的字符数组. 首先我们来看看这些int,long等等的取值范围,明白它们到底可以存多大,我们才能放心到底什么时候可以用,什么时候不可以用. 数据类型名称 字节数 别名 取值范围 int * signed,signed int 由操作系统决定,即与操作系统的"字长"有关 unsi

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数

//  [3/17/2015 JmingS] /* 此题可直接推导出公式: {(A1+A2+……+An)!} / {A1!A2!……An!} 由于 (12×26)! = 312! 只能通过数组来存储,所以又涉及『大数乘法』和『大数除法』, 大数实现的主要思想模拟手算,具体参考程序. */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5

51 Nod 1029 大数除法【Java大数乱搞】

1029 大数除法 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给出2个大整数A,B,计算A / B和A Mod B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 <= 100000,A,B >= 0) Output 第1行:A / B 第2行:A Mod B (A % B) Input示例 987654321 1234 Output示例 800368 209 题目链接:http://www.51nod.com/onlineJud

高精度之大数除法

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

GUID转换成16位字符串或19位唯一字符串

整理几个常用GUID转换成16位字符串或19位唯一字符串方法: /// <summary> /// 根据GUID获取16位的唯一字符串 /// Author : 付义方 /// </summary> /// <param name=\"guid\"></param> /// <returns></returns> public static string GuidTo16String() { long i = 1;

C# GUID转换成16位字符串或19位数字并确保唯一

/// <summary> /// 根据GUID获取16位的唯一字符串 /// </summary> /// <param name=\"guid\"></param> /// <returns></returns> public static string GuidTo16String() { long i = 1; foreach (byte b in Guid.NewGuid().ToByteArray())

二进制转换 ——大数除法

1132: 数据结构习题--使用栈实现进制转换 时间限制: 1 Sec  内存限制: 128 MB 提交: 15  解决: 9 [提交][状态][讨论版] 题目描述 使用栈将一个很长(>30)的十进制数转换为二进制数 输入 若干个很长的十进制数 每行一个 输出 转换为二进制,每行输出一个 样例输入 123456789012345678901234567890 753951684269875454652589568545854758545824 样例输出 110001110111010010000

hdu 1261 排列组合&amp;&amp;大数除法

唉  不知道第一次发什么神经 第一次把t定义成char 型的了 小数还对 大数就不多了...找了半个小时才找到  以后要细心了 求大数 一定是用字符串保存,,long long 肯定溢出. 具体思路就是把所有字符个数加起来的阶乘n!除以各个字符出现的个数的阶乘. #include <stdio.h> #include <string.h> #define num 1000 int main() { char str[num]; long long n,x,count,j,i,q,s