题解

1324 条题解

  • 0

    A+B问题,一道历史悠久的问题,下面就给出该题的多种解法。

    解法一:首先用cin/scanf读入两个int类型数a和b,再用cout/printf输出a+b的结果。核心代码:cin>>a>>b; cout<<a+b<<endl;

    解法二:为了防止计算a+b时占用过多内存(其实也没多少),可使用C++的提供的内联汇编来完成本题。核心代码:

    __asm
    (
    "mov %1,%%eax \n\t"
    "mov %2,%%ebx \n\t"
    "add %%eax,%%ebx \n\t"
    "mov %%ebx,%0"
    :"=m"(b)
    :"m"(a),"m"(b)
    );
    最后输出b即可。(事实上,这就是不让编译器替我们把高级语言翻译为汇编语言,直接就替它做了)

    解法三:为防止出题人故意出大数据恶心我们,可采用高精度加法完成此题。核心代码:

    char s1[101] , s2[101] , l1 , l2 , l3;
    int a[101]={0} , b[101]={0} , c[102]={0};
    cin >> s1 >> s2;
    l1 = strlen(s1);
    l2 = strlen(s2);
    for (int i = 0 ; i < l1 ; i++) a[l1 - i] = s1[i] - '0';
    for (int i = 0 ; i < l2 ; i++) b[l2 - i] = s2[i] - '0';
    l3 = max(l1 , l2);
    for (int i = 1 ; i <= l3 ; i++)
    {
    c[i] += a[i] + b[i];
    c[i + 1] = c[i] / 10;
    c[i] %= 10;
    }
    if (c[l3 + 1] == 1) l3++;
    for (int i = l3 ; i >= 1 ; i--) cout << c[i]; cout<<endl;

    解法四:(从此以后均为扯淡)

    设f[i][j]表示i+j的值。可得状态转移方程为f[i][j] = max(f[i-1][j]+1 , f[i][j-1]+1)。由于任何数加0数值不变(公理),所以边界条件为f[0][i]=f[i][0]=i。最后输出f[a][b]即可。核心代码:

    for (int i = 1 ; i <= a ; i++) f[i][0] = i;
    for (int i = 1 ; i <= b ; i++) f[0][i] = i;
    for (int i = 1 ; i <= a ; i++)
    for (int j = 1 ; j <= b ; j++)
    f[i][j] = max(f[i - 1][j] + 1 , f[i][j - 1] + 1);

    解法五:分析解法四时间复杂度知若时间为O(a*b)。若a*b过大则程序必定超时。观察代码容易发现,根据分配律(公理)得:

    f[i][j-1]+1=(i)+(j-1)+1=(i)+(j)-1+1=(i-1)+(j)+1=f[i-1][j]+1

    根据上式我们可以立即将时间和空间复杂度都降低一维。核心代码:

    f[0] = 0;
    for (int i = 1 ; i <= max(a , b) ; i++)
    f[i] = f[i - 1] + 1;

    最后输出f[a]+f[b]。可以看到,时间复杂度为O(max(a,b)),为线性,可以通过此题。

    解法六:

    首先orz给出本解法的神犇

    设图G=(V, E)为一流网络,包含2个源点S1、S2和1个汇点T。构造该图使得:

    从S1、S2分别发出a、b条边,每条边的容量为1,这些边应当连接到max(a, b)个顶点上,且没有两条边拥有相同的两个端点。从这max(a, b)个顶点分别连一条容量为+∞的边到汇点T。然后在这个流网络上面跑Dinic算法、Ford-Fulkerson算法之类的东西,可以练练写网络流的手感。

  • 0
    @ 2016-03-19 03:54:45

    Java作死版
    ```java
    import java.math.BigDecimal;
    import java.util.*;

    public class Main {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    BigDecimal a = BigDecimal.valueOf(scanner.nextLong());
    BigDecimal b = BigDecimal.valueOf(scanner.nextLong());
    for(;b.longValue()>0;b=b.subtract(BigDecimal.ONE)){
    a = a.add(BigDecimal.ONE);
    }
    System.out.println(a.toString());
    scanner.close();
    }
    }
    ```

  • 0
    @ 2016-02-29 16:57:30
    var a,b:longint;
    begin
        readln(a,b);
        writeln(a+b);
    end.
    
  • 0
    @ 2016-02-19 16:20:15

    import java.io.*;
    import java.util.*;

    public class Main
    {
    public static void main (String args[]) throws Exception
    {
    BufferedReader stdin =
    new BufferedReader(
    new InputStreamReader(System.in));

    String line = stdin.readLine();
    StringTokenizer st = new StringTokenizer(line);
    int a = Integer.parseInt(st.nextToken());
    int b = Integer.parseInt(st.nextToken());
    System.out.println(a+b);
    }
    }

  • 0
    @ 2016-02-17 23:36:14

    编译成功

    测试数据 #0: WrongAnswer, time = 0 ms, mem = 504 KiB, score = 0

    测试数据 #1: WrongAnswer, time = 0 ms, mem = 504 KiB, score = 0

    测试数据 #2: WrongAnswer, time = 0 ms, mem = 512 KiB, score = 0

    测试数据 #3: WrongAnswer, time = 0 ms, mem = 508 KiB, score = 0

    测试数据 #4: WrongAnswer, time = 0 ms, mem = 508 KiB, score = 0

    测试数据 #5: WrongAnswer, time = 0 ms, mem = 508 KiB, score = 0

    测试数据 #6: WrongAnswer, time = 0 ms, mem = 504 KiB, score = 0

    测试数据 #7: WrongAnswer, time = 0 ms, mem = 504 KiB, score = 0

    测试数据 #8: WrongAnswer, time = 15 ms, mem = 504 KiB, score = 0

    测试数据 #9: WrongAnswer, time = 15 ms, mem = 508 KiB, score = 0

    WrongAnswer, time = 30 ms, mem = 512 KiB, score = 0

  • 0
    @ 2016-02-17 23:31:19

    不是跟hello world一样吗,真是……
    c++
    #include<stdio.h>
    int main(){
    printf("A+B problem\n");
    return 0;
    }

  • 0
    @ 2016-02-09 20:19:10

    #include<cstdio>
    using namespace std;
    int a, b;
    int main()
    {
    scanf("%d%d",&a,&b);
    printf("%d\n",(a+b));
    return 0;
    }

  • 0
    @ 2015-12-14 03:12:43

    #include<stdio.h>
    int main()
    {
    int x,y;
    scanf("%d %d",&x,&y);
    printf("%d",x+y);
    return 0;
    }

  • 0
    @ 2015-12-11 07:56:51

    include<iostream> include<cmath> include<cstdio> include<cstring> include<algorithm>
    using namespace std;
    int main()
    {
    //freopen("p.in","r",stdin);
    //freopen("p.out","w",stdout);
    int a,b,st[100000],maxx=1,g;
    cin>>a>>b;
    for(int i=a;i>=1;i--)
    {
    g=1;
    st[1]++;
    while(st[g]>=10)
    {
    st[g]-=10;
    g++;
    st[g]+=1;
    }
    maxx=max(g,maxx);
    }
    for(int j=b;j>=1;j--)
    {
    g=1;
    st[1]++;
    while(st[g]>=10)
    {
    st[g]-=10;
    g++;
    st[g]+=1;
    }
    maxx=max(g,maxx);
    }
    for(int i=maxx;i>=1;i--)
    cout<<st[i];
    return 0;

  • 0
    @ 2015-12-11 07:54:48

    果断高精度。。。。。。。。。。。。。。。。。。。。。。。

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int main()
    {
    //freopen("p.in","r",stdin);
    //freopen("p.out","w",stdout);
    int a,b,st[100000],maxx=1,g;
    cin>>a>>b;
    for(int i=a;i>=1;i--)
    {
    g=1;
    st[1]++;
    while(st[g]>=10)
    {
    st[g]-=10;
    g++;
    st[g]+=1;
    }
    maxx=max(g,maxx);
    }
    for(int j=b;j>=1;j--)
    {
    g=1;
    st[1]++;
    while(st[g]>=10)
    {
    st[g]-=10;
    g++;
    st[g]+=1;
    }
    maxx=max(g,maxx);
    }
    for(int i=maxx;i>=1;i--)
    cout<<st[i];
    return 0;
    }

  • 0
    @ 2015-12-06 20:05:58

    integer就够了~~~~~

  • 0
    @ 2015-11-29 16:38:18

    var a,b"inteer;
    begin
    readln(a,b);
    writeln(a+b);
    end.
    我想吐

  • 0
    @ 2015-11-29 16:36:17

    Free Pascal Compiler version 2.6.2 [2013/02/12] for i386
    Copyright (c) 1993-2012 by Florian Klaempfl and others
    Target OS: Win32 for i386
    Compiling foo.pas
    Linking foo.exe
    5 lines compiled, 0.1 sec , 27904 bytes code, 1628 bytes data
    测试数据 #0: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 616 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    测试数据 #3: Accepted, time = 15 ms, mem = 612 KiB, score = 10
    测试数据 #4: Accepted, time = 15 ms, mem = 612 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 608 KiB, score = 10
    测试数据 #7: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    测试数据 #8: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    测试数据 #9: Accepted, time = 0 ms, mem = 612 KiB, score = 10
    Accepted, time = 30 ms, mem = 616 KiB, score = 100

  • 0
    @ 2015-11-22 10:27:53

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main()
    {
    char a1[100],b1[100];
    int a[100],b[100],c[100],lena,lenb,lenc,i,x;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    gets(a1);
    gets(b1);
    lena=strlen(a1);
    lenb=strlen(b1);
    for(i=0;i<=lena-1;i++)
    a[lena-i]=a1[i]-48;
    for(i=0;i<=lenb-1;i++)
    b[lenb-i]=b1[i]-48;
    lenc=1;
    x=0;
    while(lenc<=lena||lenc<=lenb)
    {
    c[lenc]=a[lenc]+b[lenc]+x;
    x=c[lenc]/10;
    c[lenc]%=10;
    lenc++;
    }
    c[lenc]=x;
    if(c[lenc]==0)
    lenc--;
    for(i=lenc;i>=1;i--)
    cout<<c[i];
    cout<<endl;
    return 0;
    }

  • 0
    @ 2015-11-11 16:20:06

    var a,b:longint;
    begin
    readln(a,b);
    writeln(a+b);
    end.

  • 0
    @ 2015-11-05 22:17:26

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d\n",a+b);
    system("pause");
    return 0;
    }

  • 0
    @ 2015-11-05 16:22:09

    #include <stdio.h>

    int main()
    {
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);
    return 0;
    }

  • 0
    @ 2015-11-04 18:40:29

    #include <stdio.h>

    int main()
    {
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);

    //system("PAUSE");
    return 0;
    }

  • 0
    @ 2015-10-26 16:47:49

    #include <stdio.h>
    int main()
    {
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);

    system("PAUSE");

    return 0;
    }

  • 0
    @ 2015-04-22 21:29:13

    var a,b:longint;
    begin
    readln(a,b);
    writeln(a+b);
    end.

信息

ID
1000
难度
9
分类
(无)
标签
(无)
递交数
74670
已通过
28578
通过率
38%
被复制
238