ZCMU-1179

image
image

我的错误:
明知道是大数问题但不是不想写数组或者字符串的结构。


思路

  1. 网上查阅后发现可以使用JAVA的大数类型做。
  2. 若不使用JAVA则就是整型数组或者字符串的情况。
  3. 将a^b结果放在数组当中,实时更新数组,每次用a去乘当前数组,记得加长。
  4. 因为上面情况得到的结果是倒序的不方便比较(通过比较来判断正负情况),所以还要倒过来。
  5. 最后模拟减法过程并输出结果。
    其实代码可以简短一点的

C++代码(可减短,望各位提供简短代码)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

//计算a^b的结果 
int pow(int sum[],int x,int n){
	int i,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){
			//这里先用后加,所以最后长度长1; 
			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-1-j];
		sum[lenth-1-j]=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;
	scanf("%d",&T);
	while(T--){
		int a,b,maxn;
		int na[30000]={1};
		int nb[30000]={1};
		int result[30000]={0};
		char sa[30000];
		char sb[30000];
		scanf("%d%d",&a,&b);
		
		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;
}
JAVA代码
import java.util.*;
import java.math.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a, b;
        for(int i=0;i<n;i++){
            while(sc.hasNext()){
                a=sc.nextInt();
                b=sc.nextInt();
                System.out.println(BigInteger.valueOf(a).pow(b).subtract(BigInteger.valueOf(b).pow(a)));
            }
        }
    }
}
posted @ 2024-05-27 17:17  海&贼  阅读(24)  评论(0)    收藏  举报