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