当前位置: 首页 > news >正文

洛谷 P2152 [SDOI2009]SuperGCD (高精度)

这道题直接写了我两个多小时……

主要是写高精度的时候还存在着一些小毛病,调了很久

在输入这一块卡了很久。

然后注意这里用while的形式写,不然会炸

最后即使我已经是用的万进制了,但是交上去还是有两个点超时

然后就开始漫长的改进,一直过不了那两个点。

然后突然发现,貌似这道题没有涉及到乘法。

那不就可以直接开10的九次方为一位了(10的9次方是int的最大数量级)

我交上去之后就AC了,全部测试点交上去总和4.6秒

然后原来我一个数开的是2500这么大,因为题目给的10000位,之前用万进制除以4就是2500

然后我现在改成了1200,大约是10000除以9

然后……

交上去总和3秒

直接快了一秒多

而且单个测试点最多也就0.7秒,而这道题的最大限制是2s

看来省空间的时候时间也省了很多

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;

const int MAXN = 1200;
const int base = 1e9;
struct bignum
{
    int len, s[MAXN];
    bignum() { len = 0; memset(s, 0, sizeof(s)); }
};

bignum operator - (bignum a, const bignum& b)
{
    for(int i = a.len; i >= 1; i--)
    {
        a.s[i] -= b.s[i];
        if(a.s[i] < 0) a.s[i+1]--, a.s[i] += base;
    }
    while(!a.s[a.len] && a.len > 0) a.len--;
    return a;
}

bool judge(bignum a, bignum b) //这种写法很简略 
{
    if(a.len != b.len) return a.len > b.len;
    for(int i = a.len; i >= 1; i--)
        if(a.s[i] != b.s[i]) return a.s[i] > b.s[i];
    return true;
}

bignum operator % (bignum a, bignum b)
{
    while(judge(a, b)) a = a - b;
    return a;
}

char str[10000 + 5];
void read(bignum& a) //这个输入代码写了好久 
{
    scanf("%s", str);
    reverse(str, str + strlen(str)); //先翻转在说 
    int& len = a.len = 0;
    for(int i = 0, w; i < strlen(str); i++, w *= 10)
    {
        if(i % 9 == 0) len++, w = 1;
        a.s[len] += w * (str[i] - '0');
    }
}

void print(bignum a)
{
    printf("%d", a.s[a.len]);
    for(int i = a.len - 1; i >= 1; i--)
        printf("%09d", a.s[i]);
    puts("");
}

int main()
{
    bignum a, b, c;
    read(a); read(b);
    while(b.len) //规定len = 0时值为0 
    {
        c = a % b;
        a = b;
        b = c;
    }
    print(a);
    return 0;
}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/sugewud/p/9819342.html

相关文章:

  • Linux 基本概念 命令
  • 26. 删除排序数组中的重复项
  • golang包time用法详解
  • Android TV 开发(2)
  • 百度面试Web前端的经历,值得收藏
  • Unity配置安卓打包环境JDK和SDK下载以及配置详解
  • 删除n天前的所有目录和文件
  • 主流的消息队列MQ比较,详解MQ的4类应用场景
  • too many connections 解决方法
  • php的分层思想
  • 在aws ec2上使用root用户登录
  • nginx+tomcat+java部署总结
  • 云服务器有哪些操作系统?
  • 【对讲机的那点事】对讲机锂离子电池使用常识你了解吗?
  • vue-cli中使用v-chart及导出chart图片
  • es的写入过程
  • gitlab-ci配置详解(一)
  • Javascript设计模式学习之Observer(观察者)模式
  • MobX
  • Shadow DOM 内部构造及如何构建独立组件
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 构造函数(constructor)与原型链(prototype)关系
  • 简单基于spring的redis配置(单机和集群模式)
  • 聊一聊前端的监控
  • 批量截取pdf文件
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 首页查询功能的一次实现过程
  • 数据结构java版之冒泡排序及优化
  • 数据科学 第 3 章 11 字符串处理
  • 线上 python http server profile 实践
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (理论篇)httpmoudle和httphandler一览
  • (算法二)滑动窗口
  • (一)SpringBoot3---尚硅谷总结
  • .gitignore文件设置了忽略但不生效
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net6使用WebSocket与前端进行通信
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .skip() 和 .only() 的使用
  • ::before和::after 常见的用法
  • @font-face 用字体画图标
  • @Transactional类内部访问失效原因详解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [c++] C++多态(虚函数和虚继承)
  • [C++]高精度 bign (重载运算符版本)