a^b(取模运算)

Description

对于任意两个正整数a,b(0 <= a, b < 10000)计算ab各位数字的和的各位数字的和的各位数字的和的各位数字的和。

Input

输入有多组数据,每组只有一行,包含两个正整数a,b。最后一组a=0,b=0表示输入结束,不需要处理。

Output

对于每组输入数据,输出ab各位数字的和的各位数字的和的各位数字的和的各位数字的和。

Sample Input

2 3
5 7
0 0

Sample Output

8
5

用到的知识点

  • ( a + b ) % m o d = ( ( a % m o d ) + ( b % m o d ) ) % m o d (a + b) \% mod = ((a \% mod) + (b \% mod)) \% mod (a+b)%mod=((a%mod)+(b%mod))%mod
  • ( a − b ) % m o d = ( ( a % m o d ) − ( b % m o d ) + m o d ) % m o d (a - b) \% mod = ((a \% mod) - (b \% mod) + mod) \% mod (ab)%mod=((a%mod)(b%mod)+mod)%mod
  • ( a ∗ b ) % m o d = ( ( a % m o d ) ∗ ( b % m o d ) ) % m o d (a * b) \% mod = ((a \% mod) * (b \% mod)) \% mod (ab)%mod=((a%mod)(b%mod))%mod
  • 一个数 mod 9 = 该数每一位之和 mod 9
  • 余数不为0,结果就是余数。余数为0,结果是9。

一些注意事项:

0的n次幂都为0

1的n次幂都为1

1000010000大概有1 + 4 * 10000位数字,假设每位最大9,所有位加起来最大360009

6位,每位最大9,所有位加起来最大54

2位,第一位最大5,第二位最大9,加起来最大14

最后结果比9小。
在这里插入图片描述
在这里插入图片描述

AC代码:

#include <cstdio>
#include <cstdlib>

int main()
{
    int a, b, i;
    while (~scanf("%d%d", &a, &b) && (a != 0 || b != 0))
    {
        if (a == 0)     // 特殊情况, 0的n次幂都是0
        {
            printf("0\n");
            continue;
        }
        int ans = 1;
        for (i = 0; i < b; i++)     // 计算 (a * a * ... * a) % 9
        {
            ans = ((ans % 9) * (a % 9)) % 9;
        }
        if (ans)
            printf("%d\n", ans);
        else            // ans是0, 说明余数为0, 最后结果应该是9
            printf("9\n");
            // 比如 9 ** 9 = 387420489, %9 = 0
            // 3 + 8 + 7 + 4 + 2 + 0 + 4 + 8 + 9 = 45, %9 = 0
            // 4 + 5 = 9, %9 = 0
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值