求一数的N次方的最后几位数(待续)

原创 2008年10月03日 17:03:00

  我曾遇到过一个求解一个数的N次方的末尾几位数字的问题。我首先想到的是先求出它的N次方,然后

再分解这个结果。可是后来又考虑到数据溢出问题,因此这个方法有很大的局限性。
  然后我列出几个算式。发现要求最后几位数,跟本没必要把最后的结果求出来。如求X的Y次方末尾M位

数,只需在每部计算时保留中间结果的后M位数就可以了,然后用这M个数依次去乘X,最后再移位相加即

可。
  如:(M=3)  123*123*123=1860867
         123
       * 123
     ---------
         369
        246
       123
     ---------
       15129  
  此时,只需保留15429的最后三位:4,2,9,然后再计算
        129
      * 123
     --------
        387
       258
      129
     --------
        867 


  于是我写下了如下的代码:(DEV C++编译通过) 
 #include<stdio.h>
 #define MAX 5
 int sub_digits[4],//存放中间结果,如上例中的387,258,129等
 rear[MAX];//存放末尾数
 int depart(int m,int digits[],int n)
 {
 //分解数m的最后n位,并返回实际分解出的位数
     int i;
         for(i=0;i<n;i++)
          {
                digits[i]=m%10;
               m/=10;
              if(!m)
                   break;
          }
         if(i!=n)
         return i+1;
            return i;
 }
 long ntimes(int m,int n)
 {
     long result,x=(long)m;
     result=1L;
     while(n--)
     {
         result*=x;
     }
     return result;
 }
 int main()
 {
     int m,n,i,N,j;
     int n_rear;
     int extra;
     long sum;
      printf("底数m,指数n,取最后N位数: ");
      scanf("%d,%d,%d",&m,&n,&N);
      n_rear=depart(m,rear,N);
      for(j=1;j<n;j++)
      {
               for(i=0;i<n_rear;i++) 
                     sub_digits[i]=rear[i]*m;
               extra=1;
        sum=0L;
               for(i=0;i<n_rear;i++)
               {
                     sum+=sub_digits[i]*extra;
                     extra*=10;
               }
               n_rear=depart(sum,rear,N);
        }
       for(i=0;i<N;i++)
         printf("%d ",rear[i]);
          printf("/n/n%d的%d次方结果为:%d",m,n,ntimes(m,n));
     getch();
     return 0;
 }
  以上代码只是大致实现了那个思路,但它还是不完善,它的局限性在于sum+=sub_digits[i]*extra;由

于sum变量是long型的,还是会产生数据溢出。要能计算更大的结果,可以用一个数组代替

sum.........(To be continued).

华为笔试题: 求M的N次方的最后三位

描述:  正整数M 的N次方有可能是一个非常大的数字,我们只求该数字的最后三位 例1: 比如输入5和3 ,5的3次方为125,则输出为125  例2: 比如输入2和10  2的10次方为...
  • u010889616
  • u010889616
  • 2016年01月31日 17:51
  • 1012

任意次方后的最后三位数——c语言算法实现

题目: 求一个整数任意次方的最后三位数,即x^y的最后三位数,要求x,y从键盘输入 解析: 取最后三位数,我们首先想到的肯定是用取余运算,如果直接将运算结果来进行...
  • byhuamo
  • byhuamo
  • 2013年11月22日 11:00
  • 4621

[华为机试练习题]50.求M的N次方的最后三位

题目描述: 正整数M 的N次方有可能是一个非常大的数字,我们只求该数字的最后三位例1:比如输入5和3 ,5的3次方为125,则输出为125 例2:比如输入2和10 2的10次方为1024 ,...
  • SunnyYoona
  • SunnyYoona
  • 2015年07月04日 11:48
  • 3587

c语言求x的n次方

#include double power(double x,int n); main() { double x; int n; printf("Input x,n:"); s...
  • qq_35038153
  • qq_35038153
  • 2017年04月18日 12:07
  • 3869

求一个数n次方后的末尾数(数论/快速幂)

问题描述 hdu1061-Rightmost Digit hdu1097-A hard puzzle 这两个oj题目思路几乎一样,都是为了快速求出一个数n次方后的末尾数为都多少? 解题思路 1的所有...
  • yanqianglifei
  • yanqianglifei
  • 2017年08月31日 10:04
  • 494

2的N次方是多少位数

描述 编程精确计算2的N次方。(N是介于100和1000之间的整数)。 输入 正整数N (100≤N≤1000) 输出 2的N次方 样例输入 200 样...
  • u013884561
  • u013884561
  • 2014年11月03日 22:36
  • 548

求n次方的算法

今天看交大的数据结构书,看到了一个计算n次方的好算法,它的时间复杂度只有logN,一般我们可能用循环,时间复杂度是O(n),当这个算法只有O(logN) 确切点说是O(6logN) 算法贴来...真高...
  • greenerycn
  • greenerycn
  • 2007年09月09日 18:31
  • 4305

n^n的第一位数

http://www.cnblogs.com/dmesg/archive/2009/08/02/1536997.html 我想知道怎么求N的N次方,这个数据是很大的,但是我要的是这个数据的最...
  • zichuan123456
  • zichuan123456
  • 2012年02月11日 11:03
  • 864

求n的n次方的第一位数字

#include#includeusing namespace std;int nn(int n){     double p,a;     __int64 m;//long long     if(...
  • lwl_ls
  • lwl_ls
  • 2007年05月19日 00:20
  • 923

编写函数求x的n次方

#include using namespace std; double power(double x,int n)    // {     double val=1.0;     wh...
  • yshx1990
  • yshx1990
  • 2014年10月21日 14:07
  • 852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求一数的N次方的最后几位数(待续)
举报原因:
原因补充:

(最多只允许输入30个字)