首页 > 其他分享 >__int1024

__int1024

时间:2024-04-11 21:34:18浏览次数:20  
标签:__ return int1024 int len carry

__int1024

手搓结构体
整合高精
(其实还可以更大 改下数组就行)

Elaina's code
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<cstdlib>
#include<algorithm>
#define base 100000
#define cut 5
#define L 1024
using namespace std;

struct __int1024{
    int len;
    long long num[L];
    __int1024(){
        len=1;
        memset(num,0,sizeof(num));
    }
    __int1024 operator=(const __int1024 &a){
        len=a.len;
        for(int i=0;i<len;i++)
         	num[i]=a.num[i];
        return *this;
    }
    long long &operator[](int a){
        return num[a];
    }
    long long operator[](int a)const{
        return num[a];
    }
    friend istream&operator>>(istream&,__int1024&);
    friend ostream&operator<<(ostream&,__int1024&);
};

int operator>(const __int1024 a,const __int1024 b){
    if(a.len!=b.len){
        if(a.len>b.len){
        	return 1;
		}
        return 0;
    }
    for(int i=a.len-1;i>=0;i--)
     	if(a[i]!=b[i]){
        	if(a[i]>b[i]){
        		return 1;
			}
        	return 0;
    	}
    return 0;
}

int operator==(const __int1024 a,const __int1024 b){
    if(a.len!=b.len)
     	return 0;
    for(int i=0;i<a.len;i++)
     	if(a[i]!=b[i])
      	return 0;
    return 1;
}

int operator<(const __int1024 a,const __int1024 b){
    if(a>b||a==b)return 0;
    return 1;
}

__int1024 operator+(__int1024 a,__int1024 b){
    __int1024 ret;
    long long carry=0;
    for(int i=0;;i++){
        ret[i]=a[i]+b[i]+carry;
        carry=ret[i]/base;
        ret[i]%=base;
        if(i>=a.len&&i>=b.len&&carry==0)
         	break;
    }
    ret.len=min(L,max(a.len,b.len)+10);
    while(ret.len>0&&ret[ret.len-1]==0)
     	ret.len--;
    if(ret.len==0)
     	ret.len=1;
    return ret;
}

__int1024 operator+(__int1024 a,int b){
    long long carry=b;
    for(int i=0;;i++){
        a[i]+=carry;
        carry=a[i]/base;
        a[i]%=base;
        if(a[i]==0&&carry==0&&i>=a.len)
         break;
    }
    a.len=min(L,a.len+10);
    while(a.len>0&&a[a.len-1]==0)
     	a.len--;
    return a;
}

__int1024 operator*(__int1024 a,__int1024 b){
    __int1024 ret;
    for(int i=0;i<a.len;i++)
     	for(int j=0;j<b.len;j++)
      		ret[i+j]+=a[i]*b[j];
    long long carry=0;
    for(int i=0;;i++){
        ret[i]+=carry;
        carry=ret[i]/base;
        ret[i]%=base;
        if(ret[i]==0&&carry==0&&i>=a.len+b.len-1)
         	break;
    }
    a.len=min(L,a.len+b.len+10);
    while(a.len>0&&a[a.len-1]==0)
     	a.len--;
    return a;
}

__int1024 operator*(__int1024 a,int b){
    long long carry=0;
    for(int i=0;;i++){
        carry+=a[i]*b;
        a[i]=carry%base;
        carry/=base;
        if(carry==0&&a[i]==0&&i>=a.len)
         	break;
    }
    a.len=min(L,a.len+10);
    while(a.len>0&&a[a.len-1]==0)
     	a.len--;
    return a;
}

__int1024 operator-(__int1024 a,__int1024 b){
    long long carry=0;
    for(int i=0;;i++){
        a[i]-=b[i]+carry;
        if(a[i]<0)
         	carry=(-a[i]/base+1);
        else carry=0;
        a[i]+=carry*base;
        if(carry==0&&i>=b.len)
         	break;
    }
    while(a.len>0&&a[a.len-1]==0)
     	a.len--;
    return a;
}

__int1024 operator-(__int1024 a,int b){
    long long carry=b;
    for(int i=0;;i++){
        a[i]-=carry;
        if(a[i]<0)
         	carry=(-a[i]/base+1);
        else carry=0;
        a[i]+=carry*base;
        if(carry==0)
         	break;
    }
    while(a.len>0&&a[a.len-1]==0)
     	a.len--;
    return a;
}

__int1024 operator/(__int1024 a,int b){    
	long long carry=0;
    for(int i=a.len-1;i>=0;i--){
        a[i]+=carry*base;
        carry=a[i]%b;
        a[i]/=b;
    }
    while(a.len>0&&a[a.len-1]==0)
     	a.len--;
    return a;
}

__int1024 operator%(const __int1024 a,int b){
     return a-(a/b)*b;
}

istream& operator>>(istream & in,__int1024 &b){
    char ch[L*cut+5];
    in>>ch;
    int l=strlen(ch);
    int count=0,sum=0,r=0;
    for(int i=0;i<l;i++)
     	if(ch[i]!='0'){
          	r=i;
          	break;
     	}
    if(r==0&&ch[r]=='0')
     	r=l-1;
    for(int i=l-1;i>=r;){
        sum=0;
        int t=1;
        for(int j=0;j<cut&&i>=0;j++,i--,t*=10)
         	sum+=(ch[i]-'0')*t;
        b[count]=sum;
        count++;
    }
    b.len=count;
    return in;
}

ostream& operator<<(ostream& out,__int1024& b){
    printf("%lld",b[b.len-1]);
    for(int i=b.len-2;i>=0;i--){
        cout.width(cut);
        cout.fill('0');
        printf("%lld",b[i]);
    }
    return out;
}

int main(){
	__int1024 a,b;
	cin>>a>>b;
	a=a+b;
	cout<<a;
}

标签:__,return,int1024,int,len,carry
From: https://www.cnblogs.com/Elaina-0/p/18130063

相关文章

  • 手机存量市场待破,到新线市场找出路?
    智能手机市场的卷是最惨烈的,没有之一。无论是技术创新、营销打法还是渠道拓展,这个领域的竞争都是极致的,也代表着科技产业的最高水平。与此同时,在经历了几年的低迷期之后,智能手机还并未迎来预期中的大复苏。一边是拼命卷创新的厂商,一边是没有释放出来的用户需求,智能手机市场如同一......
  • C++——线性动态规划
    线性动态规划引入:1.爬楼梯爬楼梯类型的问题可谓是线性DP的入门题目以及经典中的经典。我们先来看一下题目。爬楼梯题目描述有一天,三萩实在太无聊了,竟然无聊到去数台阶了。有一个楼梯一共有m级,刚开始三萩在第一级,他就想,若每次只能跨上一级或者二级,要走上m级,共有多少种走法?......
  • Spring Boot对Security的支持
    SpringBoot支持SpringSecurity,以搭建Eureka服务器为例演示添加Security之后的效果,以及探究在Security的配置是否与上述描述相符:1、导入Security坐标支持 2、访问http://localhost:8260/,如下: ......
  • 树莓派(Raspberry Pi OS)操作系统的选择
    树莓派官方下载:https://www.raspberrypi.com/software/  第一个版本:RaspberryPiOSwithdesktopandrecommendedsoftware带图形化桌面系统和常用的推荐软件的版本。 第二个版本:RaspberryPiOSwithdesktop带图形化桌面系统,但没有常用的推荐软件,内存占用较小。......
  • 【Azure Power BI】在Power BI中获取十进制随机数后,转换十六进制作为颜色值示例
    问题描述在使用PowerBIDesktop做报表,用到了其中一个图标组件(CardBrowser),可以做出比较漂亮的图片和带颜色的卡片效果:但是,在自己的数据源中,并没有颜色值。所以颜色值为0-255的十进制转换为00-FF的十六进制数据,想到了生成随机数,然后转换为颜色值。数据源格式示例:Title Coun......
  • 2024.4.11
    2024.4.11【虚怀若谷,戒骄戒躁。】Thursday三月初三<theme=oi-"language">这个好东西叫pb_ds!!!#include<bits/extc++.h>usingnamespace__gnu_cxx;usingnamespace__gnu_pbds;堆操作/数据结构配对堆二叉堆左偏树二项堆斐波那契堆代码pairing_heap_t......
  • 原型设计-高校社区
    一,对比分析墨刀、Axure、Mockplus等原型设计工具1,墨刀墨刀的上手速度非常快,大多数功能都是一碰就会,而且自带中文视频教程,新手可以很快上手学会。墨刀的产品定位是设计移动端原型设计工具,适合用于手机APP、微信小程序、以及手机Web界面的设计。其自带的部件、交互、功能,能满足移......
  • 工业辅助制造:冲压/压铸模具设计为什么需要仿真建模
    相关:https://isite.baidu.com/site/wjzz90of/4c6cf443-336f-4dcb-9830-1db415cee29d?fid=nHnvnWb3rHn4nH6drHn1nHfYnjuxnWcdg1D&ch=4&bd_vid=8058739110555694506&bd_bxst=EiaKu83a0D3TFeL900DD0c3dNfKOg40h000000ew8IUqcQ5-YUb6VtQN4Mp6ZaD000002bf4nb7KnbcYf1n4......
  • 深入理解MD5算法:原理、应用与安全
    第一章:引言导言在当今数字化时代,数据安全和完整性变得至关重要。消息摘要算法是一种用于验证数据完整性和安全性的重要工具。在众多消息摘要算法中,MD5(MessageDigestAlgorithm5)因其快速、广泛应用和相对较高的安全性而备受关注。本书将深入探讨MD5算法的原理、应用和安全性,帮......
  • git 常见操作
    1、第一次初始化gitinitgitadd.gitcommit-m‘firstcommit’[email protected]:帐号名/仓库名.gitgitpulloriginmastergitpushoriginmaster#-f强推[email protected]:git帐号名/仓库名.git2、工作基本操作gitcheckoutmaster切......