[Vijos P2000]A x B Problem
2024-08-31 13:54:24
题目大意:叫你求A × B。
解题思路:高精度。你可千万别小看这道题,这是2017年7月27日的信息。
不过也不要怕,根据twd2的题解里写的,用普通的高精度加上一些小小的修改是可以过的。
那么直接上代码吧。
C++ Code:
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
char s[5005];
long long num1[701],num2[701],num3[1700];
int main(){
int n;
scanf("%d",&n);
while(n--){
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int len=0;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c)){
s[++len]=c;
c=getchar();
}
int w=1,l1=1,l2=1;
for(int i=len;i;i--){
if(w==100000000){
w=1;l1++;
}
num1[l1]+=w*(s[i]-'0');
w*=10;
}
len=0;
while(!isdigit(c))c=getchar();
while(isdigit(c)){
s[++len]=c;
c=getchar();
}
w=1;
for(int i=len;i;i--){
if(w==100000000){
w=1;l2++;
}
num2[l2]+=w*(s[i]-'0');
w*=10;
}
memset(num3,0,sizeof(num3));
int l3=l1+l2+4;
for(int i=1;i<=l1;i++)
for(int j=1;j<=l2;j++)num3[i+j-1]+=num1[i]*num2[j];
for(int i=1;i<=l1+l2+3;i++)
if(num3[i]>=100000000){
num3[i+1]+=num3[i]/100000000;
num3[i]%=100000000;
}
while(num3[l3]==0&&l3>1)l3--;
printf("%lld",num3[l3]);
for(int i=l3-1;i;i--)printf("%08lld",num3[i]);
puts("");
}
return 0;
}
这是时间使用情况:
我觉得时间用的并不是很多,就把乘法和除法、取模放在一块,结果居然被我卡过去了!!
C++ Code:
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
char s[5005];
long long num1[701],num2[701],num3[1700];
int main(){
int n;
scanf("%d",&n);
while(n--){
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int len=0;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c)){
s[++len]=c;
c=getchar();
}
int w=1,l1=1,l2=1;
for(int i=len;i;i--){
if(w==100000000){
w=1;l1++;
}
num1[l1]+=w*(s[i]-'0');
w*=10;
}
len=0;
while(!isdigit(c))c=getchar();
while(isdigit(c)){
s[++len]=c;
c=getchar();
}
w=1;
for(int i=len;i;i--){
if(w==100000000){
w=1;l2++;
}
num2[l2]+=w*(s[i]-'0');
w*=10;
}
memset(num3,0,sizeof(num3));
int l3=l1+l2+4;
for(int i=1;i<=l1;i++)
for(int j=1;j<=l2;j++){
num3[i+j-1]+=num1[i]*num2[j];
num3[i+j]+=num3[i+j-1]/100000000;
num3[i+j-1]%=100000000;
}
while(num3[l3]==0&&l3>1)l3--;
printf("%lld",num3[l3]);
for(int i=l3-1;i;i--)printf("%08lld",num3[i]);
puts("");
}
return 0;
}
这是时间使用情况,可以发现,除了第一个点,其他都是900+ms的,有一个甚至达到了996ms!!这说明我RP好23333333。
最新文章
- AngularJS 系列 02 - 模块
- LINQ系列:C#中与LINQ相关特性
- Python学习之路——基础篇(1)字符串格式化
- hdoj (1162) 最小生成树
- Hibernate学习笔记(一):级联删除
- PHP MySQL 预处理语句
- JVM学习之Eclipse输出GC日志
- ios01
- Git版本切换
- 微服务杂谈--EureKa及自我保护
- PLSQL:orecal,tnsname简介
- 20190323——HeadFirestPython学习之异常处理
- centos6.5环境使用RPM包离线安装MariaDB 10.0.20
- java-信息安全(十七)-*.PFX(*.p12)&;个人信息交换文件
- 转:判断Caps Lock键是否打开,如果打开则关闭
- python 音乐下载演示源代码
- CTF-练习平台-Misc之 想蹭网先接开密码
- PHP学习笔记(二) ---- PHP数据类型
- 爬虫实例之使用requests和Beautifusoup爬取糗百热门用户信息
- ubuntu nvidia驱动+cuda9.0
热门文章
- 双十一只是在搞噱头么?看看ABBYY FineReader就知道了
- 如何用IE打开Chrome浏览器
- springboot---web 应用开发-文件上传
- code-reading-notes--xml 解析
- unity 获取UGUI中的Text字的坐标
- 2015 Multi-University Training Contest 7 hdu 5372 Segment Game
- Windows里正确安装Zookeeper以服务运行
- CODEVS——T 1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛
- HDU 4339 Contest 4
- Linux 0.11中write实现