首页 > 其他分享 >ZCMU-1179

ZCMU-1179

时间:2024-05-27 17:22:42浏览次数:25  
标签:30000 int na nb 1179 ZCMU lentha lenthb

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

标签:30000,int,na,nb,1179,ZCMU,lentha,lenthb
From: https://www.cnblogs.com/hai-zei/p/18216043

相关文章

  • ZCMU-1156
    思路:要改变的是一个范围的情况,所以正常情况下会超时。查阅后知道应该用一个叫做树状数组的结构。查阅和树状数组的后续情况这个也不错注意:我没怎么看懂,可能没太仔细看。树状数组当中存在的是前后的差,所以每次变动只是在start,end+1变动.因为一直上去的是lowbi......
  • ZCMU-1153
    思路一个感觉是规律问题的数学问题因为输入的是n所以要的出有关n的关系或者关系有关排序,所以可以从位次入手,设双胞胎前一个位置在ai,后一个在bi.Sum(bi-ai)=(2+3+4+5+6+...+n+1)=(1+2+3+4+5+6+...+n)+n*1=((n+1)*n)/2+n;Sum(ai+bi)=(1+2+3+4+....+2n)=((1+2n)*(2*n))/2......
  • ZCMU-1136
    思路一个数学问题要知道1为奇数,2^x次方一定为偶数。偶数=奇数+奇数,而奇数=奇数*奇数,所以x一定要是奇数才可以。注意没告诉范围所以要往大的方向考虑其中1能够被任一整数整除,所以前面加上对1的判断参考(费马小定理)#include<stdio.h>intmain(){inti,n,temp......
  • ZCMU-1111
    与背包和动态规划有关(我认为)采用dp数组存放吃掉i千克食物要用掉的钱dp最开始要尽量的大方便过程中判断和最后的输出判断实时更新dp,保留最小的钱以前不知道的printf函数可以这样用fill函数填充数组,(开始,结束,填充值);C和C++结构体里面可以放函数学习#include<c......
  • ZCMU-1129
    数学公式题罢了学长1.斯特灵公式:2.对数公式(因为以10为底,得到的是10^x,所以最后向下取整加上1);#include<cstdio>#include<cmath>usingnamespacestd;constdoublePI=acos(-1);constdoublee=exp(double(1));intstr(intn){returnfloor(log10(sqrt(2*PI*n))+......
  • ZCMU-1110
    思路:-首先可以知道最少动就是从三个角对称的划分因为不是对称划分则会出现破坏了正三角,后面还要重新对好之后就可以进行推导(按三角形我没看懂)其中设底上截出来的三角形的底为i,则上面就是n-2*i-1;所以动的数就可以算出来:[6*i^2+(4-4n)i+(n*n-n)]/2;最小就是i=(......
  • ZCMU-1101
    这个题不怎么难,就是当时没有理解到字典序的意思:我一直以为是自己元素间的比较,后再同学帮助下明白这里是与其他比,这样就很简单了。就是要求当前那个最小就可以了。对这道题我有点吐槽明明自己都说了最后一组数据没有空行,但是最后AC后的代码还是有换行的!#include<string.h>......
  • ZCMU-1053
    比较简单记录一下主要感觉它这个题目没说清楚,题目要求:先有n,接着给出长度为n的标准组,然后给出猜测组,输出的两个数一个是有多少个是相对应的既相同坐标其数值也相同,后一个是两个都有但是位置不同(不含已经相同的)我觉得它少了一类个例子:类似于123436133343思路:用......
  • ZCMU-1051
    比较来说不太难其实,当然找到一定的公式这与前面的1033相识,都会用到f(i,j)=f(i-1,j)+f(i-1,j-1)我们可以先从小部分看出来,一层可以整体或者两部分,在面对第i层看前面i-1层中分成j-1分和j分,但是又因为自己可以分成分开与不分开所以要用到三维数组,分别放置不分开与分开我觉得......
  • ZCMU-1033
    我觉得这位大佬说的已经很好了,可以直接看她的思路了;大佬思路但是她的代码没有考虑到1111的情况,代码思路这个是可以的很长且没有注释;#include<bits/stdc++.h>usingnamespacestd;longlongd[40][40];longlongc[40][40];longlonga[40];longlongx,y;intk,b;......