高精度 - SGU 112 a^b-b^a

简介: a^b-b^a  Problem's Link   Mean:  略 analyse: 简单题,只用编个高精度乘法和减法即可.

a^b-b^a 

Problem's Link


 

Mean: 

analyse:

简单题,只用编个高精度乘法和减法即可.

Time complexity: O(N)

 

view code

 java

import java . math . BigInteger;
import java . util . Scanner;
public class Solution
{
    public static void main( String [] args)
    {
        Scanner cin = new Scanner( System . in);
        int a , b;
        while( cin . hasNext())
        {
            a = cin . nextInt();
           b = cin . nextInt();
            System . out . println( BigInteger . valueOf( a ). pow(b ). add( BigInteger . valueOf(b ). pow( a ). negate()));
        }
    }
}

 

C++

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-01-06-20.55
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long( LL);
typedef unsigned long long( ULL);
const double eps( 1e-8);

#define inf 0xfffffff
#define CLR(a,b) memset((a),(b),sizeof((a)))

using namespace std;
int const nMax = 1000;
int const base = 10;
typedef int LL;
typedef pair < LL , LL > pij;


struct Int
{
    int a [ nMax ];
    int len;
    void clear()
    {
        CLR( a , 0);
        len = 0;
        return ;
    }
    Int ( int n = 0)
    {
        clear();
        while(n)
        {
            a [ len ++ ] =n % base;
           n /= base;
        }
    }
    bool operator < ( const Int & b) const
    {
        if( len <b . len) return true;
        if( len >b . len) return false;
        for( int i = len - 1; i >= 0; i --)
        {
            if( a [ i ] <b . a [ i ]) return true;
            if( a [ i ] >b . a [ i ]) return false;
        }
        return false;
    }
    Int operator +( Int &b)
    {
        Int c;
        c . len = max( len ,b . len);
        int d = 0;
        for( int i = 0; i < c . len; i ++)
        {
            c . a [ i ] =( a [ i ] +b . a [ i ] + d) % base;
            d =( a [ i ] +b . a [ i ] + d) / base;
        }
        while( d)
        {
            c . a [ c . len ++ ] = d % base;
            d /= base;
        }
        return c;
    }
    Int operator -( Int &b)
    {
        Int c;
        c . len = len;
        int d = 0;
        int f;
        for( int i = 0; i < c . len; i ++)
        {
            c . a [ i ] = a [ i ] -b . a [ i ] - d;
            d = 0;
            if( c . a [ i ] < 0)
            {
                c . a [ i ] += base;
                d ++;
            }
            //   printf("c[%d]=%d\n",i,c.a[i]);
        }
        while( c . a [ c . len - 1 ] == 0 && c . len > 0)
        {
            c . len --;
        }
        if( c . len == 0) c . len = 1;
        return c;
    }
    Int operator *( int &b)
    {
        Int c;
        int d;
        c . len = len;
        for( int i = 0; i < c . len; i ++)
        {
            c . a [ i ] =( a [ i ] *b + d) % base;
            d =( a [ i ] *b + d) / base;
        }
        while( d)
        {
            c . a [ c . len ++ ] = d % base;
            d /= base;
        }
        return c;
    }
    Int operator *( Int & b)
    {
        Int c;
        for( int i = 0; i < len; i ++)
        {
            for( int j = 0; j <b . len; j ++)
            {
                c . a [ i + j ] += a [ i ] *b . a [ j ];
            }
        }
        c . len = len +b . len - 1;
        int d = 0;       //就是这里忘了置0
        int f;
        for( int i = 0; i < c . len; i ++)
        {
            f = d + c . a [ i ];
            c . a [ i ] = f % base;
            d = f / base;
        }
        while( d)
        {
            c . a [ c . len ++ ] = d % base;
            d /= base;
        }
        return c;
    }
    void output()
    {
        for( int i = len - 1; i >= 0; i --) printf( "%d" , a [ i ]);
        printf( " \n ");
        return ;
    }
    string Int2Str()
    {
        string ans;
        ans . clear();
        for( int i = len - 1; i >= 0; i --)
        {
            ans +=( '0' + a [ i ]);
        }
        return ans;
    }
};

Int exp( Int b , int n)
{
    if(n == 0) return Int( 1);
    Int c = exp(b ,n / 2);
    c = c * c;
    if(n % 2 == 1) return c *b;
    return c;
}

int main()
{
    int a ,b;
    cin >> a >>b;
    Int A( a);
    Int B(b);
    A = exp( A ,b);
   B = exp(B , a);
    //  A.output();
    //  B.output();
    if( A <B)
    {
        Int C =B - A;
        cout << "-" << C . Int2Str() << endl;
    }
    else
    {
        Int C = A -B;
        // C.output();
        //  printf("%d\n",C.len);
        cout << C . Int2Str() << endl;
    }
    return 0;
}

 

目录
相关文章
|
2月前
学习使用按位异或 ^
学习使用按位异或 ^。
36 9
|
7月前
2^x modn=1
2^x modn=1
31 0
|
算法 C++
|
算法
a^b(快速幂)
题目: 求 a 的 b 次方对 p 取模的值。 输入格式: 三个整数 a,b,p ,在同一行用空格隔开。 输出格式: 输出一个整数,表示a^b mod p的值。
83 0
|
算法 搜索推荐
算法之n^2的三个算法总结
算法是真的应该好好研究研究,且让容我来水一水
134 0
(1+2+...+100)+(1^2+2^2+...+50^2)+(1/1+1/2+...+1/10)
(1+2+...+100)+(1^2+2^2+...+50^2)+(1/1+1/2+...+1/10)
|
机器学习/深度学习
计算机中的数学【费马大定理】 数学史上最著名的定理: x^n + y^n = z^n(n >2时,没有正整数解)
费马大定理,又被称为“费马最后的定理”,由17世纪法国数学家皮耶·德·费玛提出。 x^n + y^n = z^n 没有正整数解 (n >2)。 德国佛尔夫斯克曾宣布以10万马克作为奖金奖给在他逝世后一百年内,第一个证明该定理的人,吸引了不少人尝试并递交他们的“证明”。
1884 0