Andy的作業--大數乘小數

Andy的作業
Time Limit:1s Memory limit:32M
Accepted Submit:232 Total Submit:1674

Andy每天都有很多作業要做,他的老師總是在說“這些作業你明天必須交上來……”。現在他找你幫忙做其中的一項作業,給出N個整數A1, A2, ..., AN,有 M 個詢問 q (L, R),對於每個詢問,你要輸出一個整數,第L個數到第R個數的乘積,這個乘積不會超過1000位。

輸入

輸入包含多組測試數據。每組數據第一行爲兩個整數N,M (N <= 800, M <= 1000) 接下來N行,給出這N個整數。然後M行,每行兩個整數L R表示一個詢問。

輸出

對於每個詢問,輸出相應的結果。當所有詢問結束之後輸出“Homework Finished”。

樣例輸入

10 5 9 7 9 6 4 9 5 8 3 4 5 9 3 8 8 10 10 10 1 7 1 1 1 1 1

樣例輸出

4320 77760 96 4 612360 Homework Finished 1 Homework Finished 解題分析:這道題涉及到大數相乘,考慮到是大數乘小數,可以考慮用unsigned long long a[63]存放最後結果;還有一點很重要的是這道題目存在負數得情況哦!
code:
 #include<stdio.h> 
#include<string.h>
int l,r,n,m;
int num[800],b[800];
unsigned long long a[63]={1};
void fun()
{
 int flag=0,temp=1,len=1;
 register int i,j;
 memset(a,0,sizeof(a));
 a[0]=1;
 for(i=l-1;i<r;i++)
 if(num[i]==0){printf("0/n");return;}
 for(i=l-1;i<r;i++)
 {
  if(num[i]<0)temp*=-1;
  flag=0;
  for(j=0;j<=len-1;j++) //核心算法
  {
   a[j]=b[i]*a[j]+flag;
   flag=a[j]/10000000000000;
   a[j]%=10000000000000; //13個0 ,0得個數應該可以更多點
  }
  if(flag>0){len++;a[len-1]=flag;}
 }
 if(temp==-1)printf("-");
 printf("%llu",a[len-1]);
 for(i=len-2;i>=0;i--)
 printf("%13.13llu",a[i]);
      printf("/n");
}
int main()
{
 register int i,j;
 
 while(scanf("%d%d",&n,&m)!=EOF)
 {
  i=0;
  while(n--)
   scanf("%d",&num[i++]);
  for(j=0;j<i;j++)
   b[j]=num[j]>0?num[j]:-num[j];
  while(m--)
  {
   scanf("%d%d",&l,&r);
   fun();
  }
  printf("Homework Finished/n");
 }
 return 0;
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章