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))));
}
}
}
}