高精度codevs 3115-3118

本文介绍了高精度运算的实现方式,并讨论了压位技术在读入和输出过程中的应用,通过实例展示了如何使用压位参数优化读取效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板,想改压位来,可以压位后除法慢。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
long long tmp[1100];
const int base=10; 
const int wlen=1;
struct bigNumber{//大整数
   int len;
   long long num[1010];
   bigNumber(){len=1;memset(num,0,sizeof(num));   }
   void print(){
    printf("%lld",num[len]);
    for(int i=len-1;i>=1;i--)
        printf("%lld",num[i]);
    printf("\n");
}
    bool operator >(const bigNumber T)const{//重载> 
       if(len!=T.len)return len>T.len;
       for(int i=len;i>=1;i--) 
           if(num[i]!=T.num[i])return num[i]>T.num[i];       
       return false;
   }
    bool operator ==(const bigNumber T)const{//重载== 
       if(len!=T.len)return false;
       for(int i=len;i>=1;i--)
           if(num[i]!=T.num[i])return false;
       return true;
   }
   bigNumber operator +(const bigNumber B)const{//载+ 
    bigNumber C;
    C.len=max(len,B.len);
    for(int i=1;i<=C.len;i++){

        C.num[i]+=num[i]+B.num[i];
        C.num[i+1]+=C.num[i]/base;
        C.num[i]%=base;
    }
    while(C.num[C.len+1]){
        C.len++;
        C.num[C.len+1]+=C.num[C.len]/base;
        C.num[C.len]%=base;
    }
    return C;
}
bigNumber operator *(long long B){//重载*高精度*单精度 
    bigNumber C;
    C.len=len;
    for(int i=1;i<=len;i++){
        C.num[i]+=num[i]*B;
        C.num[i+1]+=C.num[i]/base;
        C.num[i]%=base;
    }
    while(C.num[C.len+1]){
        C.len++;
        C.num[C.len+1]+=C.num[C.len]/base;
        C.num[C.len]%=base;
    }
    return C;
}
   
}a;


bigNumber operator -( bigNumber A, bigNumber B){//载- 
    bigNumber C;
    if(!(A>B)){
    C=A;A=B;B=C;
    printf("-");
}
memset(C.num,0,sizeof(C.num));
    C.len=A.len;
    for(int i=1;i<=C.len;i++){
        C.num[i]=A.num[i]-B.num[i];
        if(C.num[i]<0){
C.num[i]+=base;
        A.num[i+1]--;
}
    }
    while(C.num[C.len]==0)C.len--;
    return C;
}


bigNumber operator *(const bigNumber A,const bigNumber B){//重载*
    bigNumber C;
    memset(C.num,0,sizeof(C.num));
    C.len=A.len+B.len-1;
    for(int i=1;i<=A.len;i++)
        for(int j=1;j<=B.len;j++){
            C.num[i+j-1]+=A.num[i]*B.num[j];
        C.num[i+j]+=C.num[i+j-1]/base;
        C.num[i+j-1]%=base;
    }
    while(C.num[C.len+1]){
        C.len++;
        C.num[C.len+1]+=C.num[C.len]/base;
        C.num[C.len]%=base;
    }
    return C;
}


bigNumber operator /(const bigNumber A,const long long B){//高精度/单精度 
    long long T=0ll;
    bigNumber C;
    memset(C.num,0ll,sizeof(C.num));
    C.len=A.len;
     for(int i=A.len;i>=1;i--){    
        T=(T*base+A.num[i]);
C.num[i]=T/B;
T=T%B;
}
while(C.len>1&&C.num[C.len]==0)C.len--;   
    return C;
}
inline bigNumber operator /( bigNumber A,const bigNumber B){//高精度/高精度

bigNumber C,D;
C.len=A.len;
D.len=1;
for(int i=A.len;i>0;i--){
D=D*10;
D.num[1] =A.num[i];
while(!(B>D)){
D=D-B;
C.num[i]++;
}
}
while(C.len>1&&C.num[C.len]==0)C.len--;   
return C; 
}




inline void scan(bigNumber& T){
    memset(T.num,0,sizeof(T.num));
    char s[1010];
    scanf("%s",s);
    int tmp,ls;
    ls=strlen(s);
    T.len=ls;
    for(int i=1;i<=T.len;i++){
    T.num[i]=s[ls-i]-'0';
    
}
    
}




int main()
{ freopen("out.txt","w",stdout);
  int alen,al,ar,ahead;
  
  bigNumber a,b,c;  
  scan(a);
  scan(b); 
  //(a+b).print();
  //(a-b).print();
  //(a*b).print();
  (a/b).print();
  
 return 0;
}

压位参数:

const int base=10000; 
const int wlen=4;

压位后的读入:

inline void scan(bigNumber& T){
    memset(T.num,0,sizeof(T.num));
    char s[1010];
    scanf("%s",s)   ;
    int tmp,ls;
    ls=strlen(s)-1;
    T.len=ls/wlen+1;
    for(int i=1;i<=T.len;i++){
    int ed=ls-(i-1)*wlen;
    int st=max(0,ed-wlen+1);
    tmp=0;
    for(int j=st;j<=ed;j++)
    tmp=tmp*10+s[j]-'0';
    T.num[i]=tmp; 
}
    
}

压位后的输出

void print(){
    printf("%lld",num[len]);
    for(int i=len-1;i>=1;i--)
        printf("%04lld",num[i]);
    printf("\n");
}

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值