大数对大数求余

参考算法:http://blog.sina.com.cn/s/blog_170c542b80102x8on.html
题目:输入m和n,m和n为正整数,输出m%n的值。(1<=m<=10的100次方,1<=n<=10的9次方)
思路很简单 我直接复制粘贴啦
举个例子:>> 54367256 % 97
54367256 % 97我们这样模拟:
str1 - str2 = str1

54367256 - 9700000 = 44667256       (在str2末尾填充0,让str1,str2相差一位)
44667256 - 9700000 = 34967256
34967256 - 9700000 = 25267256
25267256 - 9700000 = 15567256
15567256 - 9700000 = 5867256
5867256 - 970000 = 4897256
4897256 - 970000 = 3927256
3927256 - 970000 = 2957256
2957256 - 970000 = 1987256
1987256 - 970000 = 1017256
1017256 - 970000 = 47256
47256 - 9700 = 37556
37556 - 9700 = 27856
27856 - 9700 = 18156
18156 - 9700 = 8456
8456 - 970 = 7486
7486 - 970 = 6516
6516 - 970 = 5546
5546 - 970 = 4576
4576 - 970 = 3606
3606 - 970 = 2636
2636 - 970 = 1666
1666 - 970 = 696
696 - 97 = 599
599 - 97 = 502
502 - 97 = 405
405 - 97 = 308
308 - 97 = 211
211 - 97 = 114
114 - 97 = 17    (此时:str1 < strt,循环结束) 

接下来是代码

#include <iostream>
#include <cstring>
using namespace std;

void subb(char *str1, int i) //借位函数
{
    if(str1[i-1] <= '0')
    {
        str1[i] += 10;
        str1[i-1]--;
        subb(str1, i-1);
    }
    else
    {
        str1[i] += 10;
        str1[i-1]--;
    }
}

void Minus(char *str1, char *str2) //减法函数
{
    int i,j;

    i = strlen(str1)-1;
    for(j=strlen(str2)-1; j>=0; j--, i--)
    {
        if(str1[i] < str2[j])
        {
            subb(str1, i);
        }
        str1[i] = str1[i] - str2[j] + '0';

    }
    
    for(i=0; i<strlen(str1); i++)
    {
        if(str1[i] == '0')
            ;
        else
            break;
    }

    for(j=0; j < strlen(str1); j++)
    {
        str1[j] = str1[j+i];
    }
    if(strlen(str1)==0)
    {
        str1[0] = '0';
        str1[1] = '\0';
    }
}

int relation(char *str1, char *str2) //大小比较函数
{
    int i,j,k;
    i = strlen(str1);
    j = strlen(str2);

    if(i > j)
        return 1;
    else if(i == j)
    {
        for(k=0; k<i; k++)
        {
            if(str1[k] > str2[k])
                return 1;
            else if(str1[k] < str2[k])
                return -1;
        }
        return 0;
    }
    else
        return -1;
}

int main()
{
    char str1[101], str2[101];
    memset(str1, '\0', 101);
    memset(str2, '\0', 101);
    cin >> str1;
    cin >> str2;

    int i=strlen(str1),j= strlen(str2),k=strlen(str2),l=0;
    while(relation(str1,str2) >= 0)
    {
        l++;  //统计循环次数
        i=strlen(str1);
        if(i-1 > k)
        {
            for(j=k; j < i-1; j++)
                str2[j] = '0';
            str2[j] = '\0';
//            cout << str1 << " - " << str2 << " = ";
            Minus(str1, str2);
            str2[k] = '\0';
//            cout << str1 << endl;
        }
        else
        {

//            cout << str1 << " - " << str2 << " = ";
            Minus(str1, str2);
//            cout << str1 << endl;
        }

    }

    cout << "余数 = " << str1 << endl;
    cout << str2 << endl;
    cout << "循环次数 = " << l << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值