ZCMU-1179: a^b-b^a

1179: a^b-b^a

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 486  Solved: 104
[Submit][Status][Web Board]

Description

计算a^b-b^a的值

Input

第一行一个整数T,表示接下来有T行

每行两个整数a和b,(0<a,b<1000)

Output

输出值

Sample Input

3

1 1

2 1

10 9

Sample Output

0

1

-2486784401

HINT

Source

【解析】

大数!一脸懵逼

C++代码

#include<bits/stdc++.h>
using namespace std;
int pow(int sum[], int x, int n)
{
	int j, k, temp, carry = 0, lenth = 1;
	for (j = 0; j<n; j++)
	{
		for (k = 0; k<lenth; k++)
		{
			temp = sum[k] * x + carry;
			sum[k] = temp % 10;
			carry = temp / 10;
		}
		while (carry>0)
		{
			sum[lenth++] = carry % 10;
			carry /= 10;
		}
	}
	return lenth;
}
void swapp(int sum[], int lenth)
{
	int j, temp;
	for (j = 0; j<lenth / 2; j++)
	{
		temp = sum[j];
		sum[j] = sum[lenth - j - 1];
		sum[lenth - j - 1] = temp;
	}
}
void inttochar(char s1[], int num1[], char s2[], int num2[], int lenth1, int lenth2)
{
	int j;
	for (j = 0; j<lenth1; j++)
	{
		s1[j] = num1[j] + '0';
	}
	s1[lenth1] = '\0';
	for (j = 1; j <= lenth2; j++)
	{
		s2[lenth1 - j] = num2[lenth2 - j] + '0';
	}
	for (j = 0; j<lenth1 - lenth2; j++)
	{
		s2[j] = '0';
	}
	s2[lenth1] = '\0';
}

void endd(char s1[], int num1[], char s2[], int num2[], int maxn, int result[])
{
	int j, judge = 0;
	for (j = 0; j<maxn; j++)
	{
		num1[j] = s1[maxn - j - 1] - '0';
		num2[j] = s2[maxn - j - 1] - '0';
	}
	for (j = 0; j<maxn; j++)
	{
		if (num1[j]<num2[j])
		{
			result[j] = num1[j] - num2[j] + 10;
			num1[j + 1]--;
		}
		else
		{
			result[j] = num1[j] - num2[j];
		}
	}
	for (j = maxn - 1; j >= 0; j--)
	{
		if (judge != 0 || result[j] != 0)
		{
			judge++;
			printf("%d", result[j]);
		}
	}
}
int main()
{
	int T, a, b;
	scanf("%d", &T);
	while (T--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		int maxn;
		int na[30000] = { 1 };
		int nb[30000] = { 1 };
		int result[30000] = { 0 };
		char sa[30000];
		char sb[30000];
		int lentha = pow(na, a, b);
		int lenthb = pow(nb, b, a);
		swapp(na, lentha);
		swapp(nb, lenthb);
		if (lentha>lenthb)
		{
			maxn = lentha;
			inttochar(sa, na, sb, nb, lentha, lenthb);
		}
		else
		{
			maxn = lenthb;
			inttochar(sb, nb, sa, na, lenthb, lentha);
		}
		int ret = strcmp(sa, sb);
		if (ret>0)
		{
			endd(sa, na, sb, nb, maxn, result);
			printf("\n");
		}
		else if (ret<0)
		{
			printf("-");
			endd(sb, nb, sa, na, maxn, result);
			printf("\n");
		}
		else
		{
			printf("0\n");
		}
	}
	return 0;
}

正常人会这个↑样子↑写吗!!!youmb。

看java代码,时间长一点总比百来行的好

import java.util.*;
import java.math.*;

public class Main {

	public static void main(String[] args){   
        Scanner cin = new Scanner(System.in);   
        int n = cin.nextInt(); 
        int a, b;   
        for (int i=0;i<n;i++) 
        { 
            while(cin.hasNext())
            {   
                a=cin.nextInt();   
                b=cin.nextInt();   
                System.out.println(BigInteger.valueOf(a).pow(b).subtract( (BigInteger.valueOf(b).pow(a))));
            } 
        }   
    } 
}

猜你喜欢

转载自blog.csdn.net/waterboy_cj/article/details/81130290
B
a^b
A/B
A*B