方法一的代码还是超时的,也不知道该怎么优化了,第二种方法是看了大神写的之后才明白,其实一开始就把公约数消去,最后只要将剩下的相乘即可:

方法一:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e3+10;
int a1[maxx],b1[maxx];
int a[maxx];
int b2[maxx];
int b[maxx];
char s1[maxx];
int c[maxx];
int cmp(int a[],int b[]){if(a[0]>b[0])return 1;if(a[0]<b[0])return -1;for(int i=a[0];i>0;i--){if(a[i]>b[i])return 1;if(a[i]<b[i])return -1;}return 0;
}
void sub(int a[],int b[]){if(cmp(a,b)==0){a[0]=0;return ;}for(int i=1;i<=a[0];i++){if(a[i]<b[i]){a[i+1]--;a[i]+=10;}a[i]-=b[i];}while(a[a[0]]==0&&a[0]>0)a[0]--;
}
void cpy(int a[],int b[],int j){for(int i=1;i<=a[0];i++){b[i+j-1]=a[i];}b[0]=a[0]+j-1;
}
void print(int a[]){if(a[0]==0){cout<<0<<endl;return ;}for(int i=a[0];i>0;i--){cout<<a[i];}
}
int main(){int n;while(cin>>n){if(n==0)break;int sum=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(a1,0,sizeof(a1));memset(b1,0,sizeof(b1));memset(b2,0,sizeof(b2));memset(c,0,sizeof(c));for(int i=0;i<n;i++){cin>>b[i];sum+=b[i];}a[1]=1%10;a[2]=1/10;b2[1]=1%10;b2[2]=1/10;for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){c[i+j-1]+=a[i]*b2[j];c[i+j]+=c[i+j-1]/10;c[i+j-1]=c[i+j-1]%10;}}int len1=4;while(c[len1]==0&&len1>0)len1--;memset(a,0,sizeof(a));for(int i=len1;i>0;i--){a[i]=c[i];}memset(b2,0,sizeof(b2));memset(c,0,sizeof(c));int m;for(int i=2;i<=sum;i++){m=log10(i)+1;int t=i;int j=0;while(j<m){b2[++j]=t%10;t/=10;}for(int k=1;k<=j;k++){for(int z=1;z<=len1;z++){c[k+z-1]+=b2[k]*a[z];c[k+z]+=c[k+z-1]/10;c[z+k-1]=c[k+z-1]%10;}}len1=len1+j;while(c[len1]==0&&len1>0)len1--;memset(a,0,sizeof(a));memset(b2,0,sizeof(b2));for(int k=len1;k>0;k--){a[k]=c[k];}memset(c,0,sizeof(c));}    a1[1]=b[0]%10;a1[2]=b[0]/10;b1[1]=b[1]%10;b1[2]=b[1]/10;memset(c,0,sizeof(c));for(int i=1;i<=2;i++){for(int j=1;j<=2;j++){c[i+j-1]+=a1[i]*b1[j];c[i+j]+=c[i+j-1]/10;c[i+j-1]=c[i+j-1]%10;}}int len=4;memset(b1,0,sizeof(b1));while(c[len]==0&&len>0)len--;for(int i=len;i>0;i--){b1[i]=c[i];}memset(c,0,sizeof(c));for(int i=2;i<n;i++){memset(a1,0,sizeof(a1));a1[1]=b[i]%10;a1[2]=b[i]/10;for(int j=1;j<=2;j++){for(int k=1;k<=len;k++){c[j+k-1]+=a1[j]*b1[k];c[k+j]+=c[j+k-1]/10;c[k+j-1]=c[k+j-1]%10;}}len=len+2;while(c[len]==0&&len>0)len--;memset(b1,0,sizeof(b1));for(int j=len;j>0;j--){b1[j]=c[j];}memset(c,0,sizeof(c));memset(a1,0,sizeof(a1));}a[0]=len1;b1[0]=len;c[0]=a[0]-b1[0]+1;int temp[maxx];for(int i=c[0];i>0;i--){memset(temp,0,sizeof(temp));cpy(b1,temp,i);while(cmp(a,temp)>=0){sub(a,temp);c[i]++;}}while(c[c[0]]==0&&c[0]>0)c[0]--;print(c);cout<<endl;}
}
方法二:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx=1e3+5;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}
int main()
{int n,a[maxx],t[maxx];int b[maxx];while(cin>>n&&n){memset(t,0,sizeof(t));int sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}for(int i=1;i<=sum;i++){b[i]=i;}for(int k=1;k<=n;k++){for(int j=2;j<=a[k];j++){int temp=a[k];while(temp>1){for(int i=1;i<=sum;i++){int g=gcd(b[i],temp);temp=temp/g;b[i]=b[i]/g;}}}}t[0]=1;for(int i=1;i<=sum;i++){int v=0;for(int j=0;j<=500;j++){int temp=t[j]*b[i]+v;t[j]=temp%10;v=temp/10;}}int i;for(i=500;!t[i];i--);for(int j=i;j>=0;j--){cout<<t[j];}cout<<endl;}return 0;
}

HDU1261(高精度乘法+高精度除法)相关推荐

  1. 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍 ...

  2. C++大数相乘(高精度乘法)

    高精度乘法 高精度算法,属于处理大数字的数学计算方法.在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字.一般这类数字我们统称为高精度数,高精度算法是用计算机对于超 ...

  3. (压位)高精度乘法,高精度加法,高精度减法,高精度除法

    大值 乘 大值: 题目链接:https://www.luogu.com.cn/problem/P1303 # include <iostream> # include <string ...

  4. 高精度加法 高精度减法 高度除法 高精度乘法 方法总结

    一.引言 对于数字的储存,用实数类型总会有一些不足,比如: 使用int 只能最多存储4个字节,范围也就是2的32次方: 使用double 只能最多储存8字节,就是2的64次方: 如果数字超过这个限制, ...

  5. 在计算机语言中的乘法,LOGO语言编程题  高精度乘法★★

    不限制位数的整数高精度乘法★★★★ 这是"高精度算法"系列文章中的第二篇.在"高精度加.减.乘.除"这4种计算中,加法最基础.最简单,乘法稍难,减法更难,除法最 ...

  6. [转]高精度乘法计算

    转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(In ...

  7. 高精度乘法(C++,高精度)

    采用IPO思路实现: (1)I: 为了实现个位对齐.方便计算,将数字当作字符串读入,然后转为数字: (2)P: 大致思路如下 采用二层循环实现,每次循环的操作: sum_next += (a * b ...

  8. 高精度之高精度除法(高精除以高精)

    好像NOIP并不会用到,但是作为强迫症的我还是坚持学了.高精度除以高精度我所知道的有两个思路: 手动模拟法 还是手动模拟除法过程,但是注意在截取了被除数的正确片段之后应该试商,即枚举k从1到9看当k等 ...

  9. 朴素高精度乘法的常数优化

    2015年辽宁省赛热身赛有一道高精度乘法 传送门:NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec  内存限制: 128 MB 题目描述 Calculate $a \ti ...

最新文章

  1. CSS 后台布局实例
  2. Nginx 实现 IP+项目名 访问
  3. MySQL - order by和 group by 优化初探
  4. HTML---百度新闻轮播图--定位练习
  5. KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
  6. SQL Server Express无法建立ODBC问题(错误代码67 和17)
  7. iss版本服务器读取_【IIS7服务器管理工具下载】IIS7服务器管理 v2.1.9 官方版-开心电玩...
  8. 本地邮件系统的安装及配置
  9. All xxx functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
  10. Redraiment猜想----米勒拉宾+分块打表
  11. stm32f4 自旋锁_STM32L0系列控制器低功耗模式详解
  12. 软件测试周刊(第68期):解决棘手问题的最上乘方法是:静观其变,顺水推舟。
  13. Can‘t open /dev/sdb1 exclusively. Mounted filesystem?
  14. 三维电子沙盘数字沙盘虚拟现实无人机倾斜摄影三维全景建模卫星图片矢量
  15. openwrt LEDE 更改默认固件大小
  16. python写入excel文件追加写入_Python读写/追加excel文件Demo
  17. python获取数组中最多的元素(用max函数)
  18. Caffe中Convolution层
  19. pc端汽车obd软件下载?_人人美剧,不可多得的PC端观影软件
  20. 计算机硬件故障检测实验报告,计算机系统的硬件检测实验报告

热门文章

  1. Redis 安装详细过程(redis基本使用(服务端和客户端)、修改密码)
  2. 从图(Graph)到图卷积(Graph Convolution):漫谈图 神经⽹络模型 (⼀)
  3. 擦除:提升 CNN 特征可视化的 3 种重要手段
  4. 机器视觉------- SciSmart图像定位-ROI校正算法
  5. 如何利用Tensorflow和OpenCV构建实时对象识别程序?
  6. 第十三篇:上下文无关语法 Context-Free Grammar
  7. JDBC连接Oracle数据库测试
  8. ACL 2018最佳论文公布!计算语言学最前沿研究都在这里了
  9. 在Struts2中使用OGNL
  10. ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)