【jzoj 1494】 密码 {高精度}

题目

Description
在浩浩茫茫的苍穹深处,住着上帝和他的神仆们,他们闲谈着下界的凡人俗事,对人世间表现的聪明智慧,大加赞赏。今天他们正在观赏大地风光人情之际,忽然从遥远的东海之滨传来一阵欢笑声,上帝纵目望去,只见中山纪念中学内聚集了全中山市的中小学精英学生,他们要干什么呢?
原来他们都在做一种破译密码的游戏,人们发现:将密码棒上的数字全部相乘,就是开启天庭司粮库密码锁的密码。
如:12×34×56=22848,则22848就是一组有效的密码。
“太简单了!”人们高呼起来,继续探索着。
“这不过是早期的密码系统而已。”上帝轻蔑地环顾着神仆们说道。
可是,当人们演算了123×456×789=44253432后,上帝的神色喀什不对了,要知道,44253432是一个特别的数字,这可是天庭的机密,是谁将这些机密泄露给世人的呢?
于是,上帝搬出一张牌,对司粮库主管得墨忒耳说:“将这张牌打出去,看看他们还逞能不?”
这是天庭的其中一张王牌,但平凡得很,只不过将密码的位数增大而已,可是难就难看在看到文件:password.in中的数字后,必须在1秒内将密码输出到文件:password.out中,否则这组密码就失效了。
上帝还是仁慈的,没有将更难得牌打出来,他想把天庭的粮食恩慈人间,但他绝不会将好处给那些不动脑子的人。现在请你解开天庭司粮库密码锁的密码,帮助人们获得天庭恩赐的粮食。

Input
输入文件password.in的第一行只有一个正整数n,表示密码共有n个乘积因子。
第二行至第n+1行共n行,每行有一个小于1×10^24的正整数。这n个数均为密码的乘积因子。
Output
输出文件password.out只有一行,该行只有一个正整数,为求得的密码值。


解题思路

是一道很简单,很基础的题目,a*b=c ,a=c,a*b=c就可以了。但是我比赛的时候,出奇的WA了,为什么?题目有问题啊,10^24变成了1024了


代码

#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std; 
const int inn=2501;
int n,a[inn],b[inn],c[inn],lo,t; 
void gjd()
{
    int cc=0; 
    for (int i=1;i<=lo;i++)
     for (int j=1;j<=t;j++)
     {
       c[i+j-1]+=a[i]*b[j];
       c[i+j]+=c[i+j-1]/10;
       c[i+j-1]%=10;
     }
    lo=-1;
    for (int i=inn-1;i>=1;i--)
    {
      if (c[i]&&lo==-1) 
      {
        lo=i;
      }
      a[i]=c[i];c[i]=0;
    }
}
int main()
{
    scanf("%d",&n); 
    char s[51];
    scanf("%s",s); 
    t=strlen(s);
    for (int i=1;i<=t;i++) a[i]=s[t-i]-48;
    lo=t;
    for (int i=2;i<=n;i++)
     {
        scanf("%s",s);t=strlen(s);
        for (int i=1;i<=t;i++) b[i]=s[t-i]-48;
        gjd();   
        memset(b,0,sizeof(b)); 
     }
    int g=inn; 
    while (g>1&&a[g]==0) g--; 
    for (int i=g;i>=1;i--)
     printf("%d",a[i]);     
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/80963600