洛谷P1001

# 蒟蒻的第一篇题解
## 各位大神们见谅
这是一题~~非非非非非常难~~的一道题

蒟蒻这里把自己会的都给大家双手奉上

### 按自己的喜好选择


## 01.蒟蒻们的做法

```cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
}
```
这……(大神可以直接跳过)

“cin>>”代表输入

“cout<<”代表输出

#include<bits/stdc++>是cpp语言的头文件名,功能较多

#include<iostream>是cpp语言的另一种头文件名,速度更快

(蒟蒻更喜欢第一种一些)

## 02.想进步的蒟蒻

```cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d",&a+b);
    return 0;
}
```
还是一样,就是把cin换成了scanf,把cout换成了printf
  
意思都一样
  
##  03.模拟算法
```cpp
#include<bits/stdc++.h>
using namespace std;
int fu=1,f=1,a,b,c=0;
int main(){
    cin>>a>>b;
    if(a<0&&b>0)fu=2;
    if(a>0&&b<0)fu=3;
    if(a<0&&b<0)f=-1;
    if(a==0){cout<<b;return 0;}
    if(b==0){cout<<a;return 0;} 
    a=abs(a);
    b=abs(b);
    if(a>b&&fu==3)f=1;
    if(b>a&&fu==3)f=-1;
    if(b>a&&fu==2)f=1;
    if(b<a&&fu==2)f=-1;
    if(fu==1)c=a+b;
    if(fu>1)c=max(a,b)-min(a,b);
    c*=f;
    cout<<c;
    return 0;
}
```
大家自己看着办吧……(建议蒟蒻就用前两种方法)
  
##  04.高精度算法
####  (我估计没有人想用这种方法)
高精度就是用多大的都行
  
蒟蒻这里开的是20000的数组
  
简单来说就是
  
1000000000000………………00
  
19999个零这么大
  
(蒟蒻建议大家也别那么没事干,搞坏了跟用#include<con>或shutdown差不多了)

别怪蒟蒻没提醒,千万不要用上面那俩家伙
  
不然这是在你重启之前最后看到我的最后一面了
  
```cpp
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
const int N=20000;
struct bigN{
    int len;
    int num[N];
    bigN(){
        len=0;
        memset(num,0,sizeof(int)*N);
    }
    bigN(int a){
        len=0;
        memset(num,0,sizeof(int)*N);
        while(a>0){
            num[len++]=a%10;
            a/=10;
        }
    }
    bigN(char a[]){
        len=strlen(a);
        memset(num,0,sizeof(int)*N);
        for(int i=0; i<len; i++){
            num[i]=a[len-i-1]-'0';
        }
    }
    void print(){
        for(int i=len-1; i>=0; i--){
            printf("%d",num[i]);
        }
    }
};
bigN shift(bigN a){
    for(int i=0; i<a.len-1; i++){
        if(a.num[i]<0){
            a.num[i]+=10;
            a.num[i+1]-=1;
        }
        a.num[i+1]+=a.num[i]/10;
        a.num[i]%=10;
    }
    if(a.num[a.len]!=0){
        a.len++;
    }
    while(a.num[a.len-1]>=10){
        a.num[a.len] +=a.num[a.len-1]/10;
        a.num[a.len-1]%=10;
        a.len++; 
    }
    while(a.len>1&&a.num[a.len-1]==0){
        a.len--;
    }
    return a;
}
bigN operator+(bigN a,bigN b){
    bigN c;
    c.len=max(a.len,b.len);
    for(int i=0; i<c.len; i++){
        c.num[i]=a.num[i]+b.num[i];
    }
    return shift(c);
}
int main(){
    char a[1024];
    scanf("%s",a);
    bigN bb=a;
    scanf("%s",a);
    bigN bc=a;
    bc=bb+bc;
    bc.print();
    return 0;
}
```

###### 这里蒟蒻就给大家讲~~亿~~点
memset有很多人用着用着就不知道是什么了
                          
蒟蒻再次提醒大家:是把某个数据(或数组)初始化一下
                          
##  05.高精度算法(简化版)
                          
```cpp
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main(){
    string str1,str2;
    int a[1010],b[1010];
    int len;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>str1>>str2;
    a[0]=str1.length();
    b[0]=str2.length();
    for(int i=1; i<=a[0]; i++){
        a[i]=str1[a[0]-i]-'0';
    }
    for(int i=1; i<=b[0]; i++){
        b[i]=str2[b[0]-i]-'0';
    }
    len=max(a[0],b[0]);
    for(int i=1; i<=len; i++){
        a[i]=a[i]+b[i];
        a[i+1]=a[i+1]+a[i]/10;
        a[i]%=10;
    }
    len++;
    while(a[len]==0&&len>1){
        len--;
    }
    for(int i=len; i>=1; i--){
        cout<<a[i];
    }
    return 0;
}
```
  
#### 这里是跟高精度一样的用处

##  好了,这就是蒟蒻的第一篇题解
##  欢迎和蒟蒻一起讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值