求大数高次幂的模

题目:



/*
球大数高次幂的模
X^Y mod Z

思路:

x^y mod z = (x % z)*(x % z)*、、、*(x % z)

*/
#include <stdio.h>

bool Getmi(int X, int Y, int Z, int &res)
{
	int numl(1);
	int numy(Y);
	int multi(X);
	int tmp(0);
	int tres(1);
	multi = multi % Z;
	if(multi > 1) //当余数等于0、1时直接可求得结果
	while(numy > 0)
	{
		if(multi == 1)break;//当余数等于1时结束循环
        numl = 1;
        int tt = numy;
        X = multi;
		while(X < Z && tt > 0 )
		{
			X *= multi;
			tt--;
			numl++;
		}
		tmp = numy % numl;
		while(tmp)
		{
            if(multi == 1)break;
			tres *= multi;
			tmp--;
		}
		multi = X % Z;
		numy = numy / numl;
		tres %= Z;
	}
	res = (multi * tres) % Z;
	return true;
}

int main()
{
	int x, y, z;
	int res(0);
	while(1)
	{
		res = 0;
		printf("请输入x, y, z:");
		scanf("%d %d %d", &x, &y, &z);
		if(Getmi(x, y, z, res))
		{
			printf("result = %d\n\n\n", res);
		}
		else
		{
			printf("Wrong!!!\n");
		}
	}
}
测试结果:


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值