Andy的作业--大数乘小数

来源:互联网 发布:java编程思想有多少版 编辑:程序博客网 时间:2024/05/06 20:27
Andy的作业
Time Limit:1sMemory limit:32MAccepted Submit:232Total 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;
  
原创粉丝点击