sgu112:a^b - b^a

高精度...

考验代码能力...

贴上代码(囧):

#include <stdio.h>
#include <string.h>

struct bignum
{
  int s[500];	
}A, B;

typedef struct bignum bignum;

bignum time(bignum A, bignum B)
{
  bignum C = {0};
  int i, j;
  for(i = 1; i <= A.s[0]; ++i)
    for(j = 1; j <= B.s[0]; ++j)
    {
	  C.s[i + j - 1] += A.s[i] * B.s[j];
      C.s[i + j] += C.s[i + j - 1] / 10;
      C.s[i + j - 1] %= 10;
    }
  if(C.s[A.s[0] + B.s[0]] > 0) C.s[A.s[0] + B.s[0]] %= 10, C.s[0] = A.s[0] + B.s[0];
  else C.s[0] = A.s[0] + B.s[0] - 1;
  return C;
}

bignum calc(int a, int p, bignum X)
{
  bignum T = {0};
  X.s[++X.s[0]] = 1;
  while(a) 
  {  
    T.s[++T.s[0]] = a % 10;
    a /= 10;
  }
  while(p)
  {
    if(p & 1)
	  X = time(X, T);
	T = time(T, T);
	p >>= 1;	
  }
  return X;
}

void print(bignum C)
{
  int i;
  for(i = C.s[0]; i >= 1; --i)
    printf("%d", C.s[i]);	
}

bignum minus(bignum A, bignum B)
{
  int i;
  for(i = 1; i <= B.s[0]; ++i)
    if(A.s[i] - B.s[i] < 0)
    {
      A.s[i] += 10 - B.s[i];
	  A.s[i + 1] -= 1;	
    }
    else 
      A.s[i] -= B.s[i];
  while(A.s[i] < 0)
  {
    A.s[i] += 10;
	A.s[i + 1] -= 1;
	++i;	
  }
  for(i = 204; i >= 1; --i)
    if(A.s[i] > 0) break;
  A.s[0] = i;
  return A;
}

int main()
{  
  int a, b;
  int i;
  scanf("%d%d", &a, &b);
  A = calc(a, b, A);
  B = calc(b, a, B);
  
  if(A.s[0] < B.s[0])
  {
    putchar('-');
	print(minus(B, A));	
  }
  else if(A.s[0] == B.s[0])
  {
    for(i = A.s[0]; i >= 1; --i)
      if(A.s[i] > B.s[i])
      {
        print(minus(A, B));
		break;	
      }
      else if(A.s[i] < B.s[i])
      {
        putchar('-');
		print(minus(B, A));
		break;	
      }
    if(i == 0)
      putchar('0');
  }
  else 
    print(minus(A, B));
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值