首页 > 代码库 > GDUFE-OJ 1203 快速幂

GDUFE-OJ 1203 快速幂

嘿嘿今天学了快速幂也~~

Problem Description:

   求x的y次方的最后三位数 。  

Input:

一个两位数x和一个两位数y。

Output:

输出x的y次方的后三位数。

Sample Input:

13 13

Sample Output:

253
思路:快速幂求a^b,然后mod c。因为是随便输入的a,b,所以范围很大,而题目只需求最后三位,所以百位以上的计算不用理了,直接%1000。
 1 #include <stdio.h>
 2 int main()
 3 {
 4     unsigned long long a,b;
 5     while(scanf("%llu%llu",&a,&b)!=EOF)
 6     {
 7         unsigned long long c=1,d=a;
 8         while(b!=0)
 9         {
10         if(b&1!=0)//如果是0则无需计算,因为n*1=n
11             c*=d%1000;
12             d*=d%1000;
13             b>>=1;
14         }
15         if(c%1000>99)
16         printf("%llu\n",c%1000);
17         else if(c%1000>9)
18         printf("0%llu\n",c%1000);
19         else
20         printf("00%llu\n",c%1000);
21     }
22     return 0;
23 }

 Tip:以上mod c是因为怕数字过大爆了,一是因为a的b次mod c,二是因为早晚要mod c,所以早mod 无所谓。

小知识:

      快速幂原理:a^b,将b拆成二进制数相加的形式,从而使运算次数减少

Example:a^11=a^(2^0+2^1+2^3),时间复杂度为O(log11)。

 1 scanf("%d%d",&a,&b)
 2         int c=1,d=a;
 3         while(b!=0)
 4         {
 5         if(b&1!=0)//取b的二进制数的最后一位(相当于b%2!=0)
6 c*=d;
7
d*=d; //每往右推一位,d倍增,2^0 2^1 2^2……
8
b>>=1;//将b的二进制数往右推一位(相当于b/=2)
9 }
10 printf("%d\n",c);//c=a^b

 

GDUFE-OJ 1203 快速幂