您的当前位置:首页正文

ACM小明的数学题Ⅰ C++实现

2024-11-13 来源:个人技术集锦

                                                                     小明的数学题Ⅰ
Description
小明是个小学五年级的学生,为了早点去看自己爱看的卡通,他想快点把作业做完。可是可恶的数学老师今天却布置了一道难题,小明想了很久也不知道该怎么做。你的任务就是帮小明解决掉这道数学题。
题目是这样子的,有一个整数a(-2^31<= a < 2^31-1),计算它的整数幂a^n,其中1<=n<=99。


输入:

第一行是一个整数K,表示有多少个测试用例,以后每行一个测试用例,每行有两个整数a,n。
输出:

每行输出一个测试用例的结果
Sample Input 
2
3 5
-2 5
 
Sample Output 
243
-32

#include<iostream>
using namespace std;

__int64 a[1010],b[1010],s[30],knum,e,i1,i2,i;

void cal(int n1,int n2,__int64 s1[],__int64 s2[])

 memset(a,0,sizeof(a));
 for(i1=0;i1<n1;i1++)
 {
  for(i2=0;i2<n2;i2++)
  {
   i=i1+i2;
   a[i]=a[i]+s1[i1]*s2[i2];
   if (i>e) e=i;
  }
  for(i=0;i<=e+10;i++)  {a[i+1]+=a[i]/10;a[i]%=10; }  
 } e+=10;
  for(i=e;i>=0;i--) if(a[i]==0) continue; else { e=i; break; }
 
}

void change(__int64 k)
{
 i=0;
 while(k>0) { s[i]=k%10; k/=10; i++; }
 knum=i;
}
int main()
{
 int cases,n;
 __int64 k,t;
 scanf("%d",&cases);
 while(cases--)
 {
  scanf("%I64d%d",&k,&n);
  if(k==0) { printf("0\n");continue; }
  if(n==1) { printf("%I64d\n",k);continue; }
   if(k<0 && (n%2==1) ) printf("-");
  if(k<0) k=-k;
  memset(s,0,sizeof(s));
  memset(a,0,sizeof(a));
  change(k);
 
  for(i=0;i<knum;i++) a[i]=s[i];t=n-1;e=knum-1;
   while(t>0)
  {
   t--;
   for(i=0;i<=e;i++) b[i]=a[i];
   cal(knum,e+1,s,b);
  }
 
   for(i=e;i>=0;i--) printf("%I64d",a[i]); 
  cout<<endl;
 }   
   
 return 0;
}

显示全文