我的错误:
明知道是大数问题但不是不想写数组或者字符串的结构。
思路
- 网上查阅后发现可以使用JAVA的大数类型做。
- 若不使用JAVA则就是整型数组或者字符串的情况。
- 将a^b结果放在数组当中,实时更新数组,每次用a去乘当前数组,记得加长。
- 因为上面情况得到的结果是倒序的不方便比较(通过比较来判断正负情况),所以还要倒过来。
- 最后模拟减法过程并输出结果。
其实代码可以简短一点的
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)));
}
}
}
}
标签:30000,int,na,nb,1179,ZCMU,lentha,lenthb
From: https://www.cnblogs.com/hai-zei/p/18216043