【算法总结】%运算符与取余运算

取余套路:

对取得的余数加上除数后,再对该和求除数的模,即可解决符号问题,保证取余结果恒正。(这里b是绝对值,恒大于0)

ans = (r+b)%b 

一、数位拆解

数位拆解即把一个给定的数字(如 3241)各个数位上的数字拆开,即拆成 3、 2、4、1。

例4.1 特殊乘法

AC代码(数学方法)

#include<cstdio>

int main()
{
    int a, b;//保存两个整数的变量
    while (scanf("%d%d", &a, &b) != EOF)//输入两个整数
    {
        int buf1[20], buf2[20], size1 = 0, size2 = 0;//用buf1,buf2分别保存从两个整数中拆解出来的数位数字,其数量由size1,size2表示
        while (a != 0)//数位拆解,只要a>0就不断重复拆解过程
        {
            buf1[size1++] = a % 10;//取得个位数字
            a /= 10;//数位移动
        }
        while (b != 0)//拆解第二个数字
        {
            buf2[size2++] = b % 10;
            b /= 10;
        }
        int ans = 0;
        for (int i = 0; i < size1; i++)
            for (int j = 0; j < size2; j++)
                ans += buf1[i] * buf2[j];
        printf("%d\n", ans);//打印答案
    }
    return 0;
}

AC代码(字符串方法)

#include<cstdio>

int main()
{
    char a[11], b[11];
    while (scanf("%s%s", a, b) != EOF)
    {
        int ans = 0;
        for (int i = 0; a[i] != 0; i++)
            for (int j = 0; b[j] != 0; j++)
                ans += (a[i] - '0')*(b[j] - '0');
        printf("%d\n", ans);//打印答案
    }
    return 0;
}

二、进制转换

当要十进制数 x 的 k 进制表示时,我们只需不断的重复对 x 求余(对 k),求商(除以 k),即可由低到高依次得到各个数位上的数。反过来, 要求得由 k 进制表示的数字的十进制值时,我们需要依次计算各个数位上的数字 与该位权重的积(第 n 位则权重为kn-1),然后将它们依次累加即可得到该十进制值。

例4.2 又一版A+B

AC代码

#include<cstdio>

int main()
{
    long long a, b;//确保不会溢出
    int m;
    while (scanf("%d", &m) != EOF)
    {
        if (m == 0)break;//退出条件
        scanf("%lld%lld", &a, &b);
        a = a + b;
        int ans[50], size = 0;//用ans保存转换得到的数位数字值,size为其个数
        do//依次求得各个数位上的值
        {
            ans[size++] = a % m;
            a /= m;
        } while (a != 0);//当a不为0时重复该过程
        for (int i = size - 1; i >= 0; i--) printf("%d", ans[i]);//从高位到低位输出
        printf("\n");
    }
    return 0;
}
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int main()
{
    int m;
    long long a, b, t;
    while (scanf("%d", &m) != EOF && m != 0)
    {
        int s[40];
        scanf("%lld%lld", &a, &b);
        t = a + b;
        int cnt = 0;
        do
        {
            s[cnt++] = t % m;
            t /= m;
        } while (t != 0);
        for (int i = cnt - 1; i >= 0; i--)
        {
            printf("%d", s[i]);
        }
        printf("\n");
    }
    //system("pause");
    return 0;
}
二刷

相关文章:

  • 2021-09-29
  • 2022-12-23
  • 2021-11-06
  • 2021-11-29
  • 2021-06-09
  • 2021-08-25
  • 2021-12-23
猜你喜欢
  • 2021-11-05
  • 2021-11-23
  • 2022-12-23
  • 2021-05-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案