求L^n mod m,设计O(log n)的算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wche1990/article/details/6895163
//求L^n mod m,设计O(log n)的算法
#include<stdio.h>
#include<stdlib.h>
//返回x的平方
int square(int x)
{
    return x*x;
}
//用递归思想求L的n次方,充分利用计算后的结果,减少重复计算
int exp(int L, int n)
{
    if(0 == n)return 1;
    if(0 == n%2)return square(exp(L, n/2));
    else return L*exp(L, n-1);
}

int main()
{
    int L, n, m;
    printf("请输入L,n, m: ", &L, &n, &m);
    scanf("%d%d%d", &L, &n, &m);
    int result = exp(L, n);
    printf("L^n mod m的结果为:%d\n", result % m);
    system("pause");//输出结果后停留在输出窗口
}


展开阅读全文

心得 N*M = L(L是由1和0组成的数),已知NN〉0整数),L

07-14

想了俩天,写了一段不完全代码,代码能够运行(但舍去了一些可能解的路径,因为是学习而已)。rn//测试例rn//6557rn//6552,6553,6554,6555,6556rnrn#include rn#include rnrnrnusing namespace std;rnconst int MaxBitNumber = 500; //结果值的最大位数(10进制,以下同)rnconst int MaxBitM = 500; //M的最大位数100rnconst int MaxFindPath = 5000; //搜索过的路径数rnint sIndex = MaxBitNumber; //当前M的计算位的索引值rnint Zero=0;rnrnchar s[MaxBitNumber]; //500位的10进制数,每一位占1个byte.作存储N*M结果值的栈rnchar MBits[MaxBitM]; //500位的10进制数,每一位占1个byte.作存储M结果值的栈rnrnint findPath[10][MaxFindPath]; //纪录搜索过的路径(累加值的余数,防止循环计算.没考虑溢出N*M>MaxInteger 0>i;rn cout<<"\n";rn while (i>0)rn initDate();rn if (find(i))rn //输出 s, MBitsrn cout<<"合适的结果:\t\t";rn for (int index = sIndex;index>i;rn cout<<"\n"; rn rn system("PAUSE");rn return EXIT_SUCCESS;rnrnrnvoid initDate()rn Zero=0;rn sIndex = MaxBitNumber;rn for (int i=0;i0)rn T2 = T1%10;rn T1 = T1/10; rn if (T2==0) rn X=T1;rn Zero=Zero+1;rn rn else rn break;rn rn N=X;rnrn //将N尾部的1去除 rn while (X>0)rn T2 = X%10;rn T1 = X/10;rn if (T2==1)rn sIndex = sIndex -1; rn if (isFirst)rn MBits[sIndex] = 1;rn isFirst = false;rn rn elsern MBits[sIndex] = 0; //中间的1就补0,否则将会使得计算更加复杂rn s[sIndex] = T2;rn X=T1; rn rn if (T2==0)rn sIndex = sIndex -1;rn MBits[sIndex] = 0;rn s[sIndex] = 0;rn X=T1;rn rn if (T2>1)rn //N中间包含 2...9的数,需要计算 rn if (N==X)rn return loopFind(N,0); //N的结尾数是>1:余数为0,因为还没有数据处理rn elsern return loopFind(N,X); //N的结尾数是=1:余数为除1,0以外的数rn rn rn return true; //N本身就是一个由1和0组成的数 rn rn rnrnbool loopFind(int N,int X)rn //N:被乘数rn //X:上次乘法后舍去个位后除10的余数 rn if (sIndex<0) return false; //已经到存储的上限,需要回退索引rn rn int M=0; //M的个位数 rn int J=X; //进位值rn int T1=0; //乘法的值rn int T2=0; //乘法的个位数rn int T3=0; //乘法的除10的不4舍5入的整数 rn rn //要跳过X中从后开始计的0rn //并将对应的0进存储堆 rn while (J >0)rn T2 = J%10;rn T1 = J/10;rn if (T2==0||T2==1)rn sIndex = sIndex -1;rn if (sIndex<0) return false; //超出存储范围rn MBits[sIndex] = 0;rn s[sIndex] = T2;rn J=T1; rn rn elsern break;rn rn if (T1==0&&T2==1)rn //X本身是一个由1,0组成的数rn return true; rn rn rn for (M=1;M<10;M++)rn if (pathIndex[M] > (MaxFindPath-1)) continue; //当前乘数的搜索路径已经超过最大值,不能再搜索当前乘数了. rn if (!isFind(M,X)) //该路径没有被搜索过 rn if (X>0)rn findPath[M][pathIndex[M]]=X; //纪录路径 rn pathIndex[M] = pathIndex[M] +1; //当前路径的索引值 rn rn T1 = N*M+J; //本次乘积+前次计算的余数(清理过的)rn T2 = T1%10;rn T3 = T1/10;rn if (T2<2)rn sIndex = sIndex -1;rn MBits[sIndex] = M;rn s[sIndex] = T2;rn if (sIndex<0) return false; rn if (!loopFind(N,T3)) rn //此路不通,要回溯一层 rn MBits[sIndex] = 0;rn s[sIndex] = 0;rn sIndex = sIndex +1; rn rn elsern return true;rn rn rn rn return false;rnrn rn 论坛

没有更多推荐了,返回首页