zoukankan      html  css  js  c++  java
  • qq教xixi写模拟加法【非常爆炸】

    #include<iostream>
    #include<cstdio>
    #include<math.h>
    #include<queue>
    #include<map>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    #define INF 0x3f3f3f3f
    #define PI acos(-1.0)
    
    const int N=1e3+7;//这个就是数组的长度+7就是为了多几个,也没啥意思
    
    //就是那个第三题...我知道不用while怎么做 但是一用while 就只能一直输入。。。
    
    //就是用数组模拟一个大数加法。。。。。。。
    
    int a[N];
    int b[N]; // 不是 他可以实现一个模拟加法的过程,看着吧~~~
    char s1[N];     //char是字符啊,char s[100]这样就是字符串数组。只有这样才能一串直接输入“12812123123124142124”随便都可以输入。
    char s2[N];
    //对你啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    
    void cunru(int len1,int len2)
    {
        int num=0;
        memset(a,0,sizeof(a));   //这个的头文件是 <string.h>因为我懂你啊~~~不是鸟。。。。
        memset(b,0,sizeof(b));
        for(int i=len1-1;i>=0;i--){ // a
            a[num++]=s1[i]-'0';     //懂不懂啊,你先说   因为存到字符串数组里去的字符有一个ASCII码,就是整形
        }
        num=0;
        for(int i=len2-1;i>=0;i--){     // b
            b[num++]=s2[i]-'0';
        }
    }
    
    /*
    
    比如这两个,怎么模拟你说说,我现在的这两个已经是从各个位开始了  第一个a的个位是1,十位是2,以此类推,懂吧,b数组也一样。
    
    12345618
    89618919
    到了最后我们在最高位=7,我们还要进位 ,但是我们已经跳出循环了
    那么我们模拟
    个位:9
    十位:2+9=11 但是要进位,那么这一位就是  =11%10=1  对吧?% 这个你知道吧 取膜  就是取余 2%5=2  取商就是除啊 西西~~~那么还要进位,
    但是他就算进位也才进一,就不管了,,所以我们标记一下要进位的时候就好了/
    
    */
    int ans[N];                 //答案数组;   因为数组很大,所以定义在外面。全局变量嘛对赞!
    void xixi_jiafa(int len1,int len2)          //现在就是要模拟加法了~~~~
    {
        int num=0;          //答案的长度
        int flag,xixi;      //用做标记的
        int i,j;        //a 的 b 的
        flag=0;         //因为一开始不用进位我们设为0,要进位的时候为 1
        memset(ans,0,sizeof(ans));  //这个是赋予 0 ,ans里面每个位置都是 0
            //两个长度取较大的那个。
        for(i=0;i<max(len1,len2);i++)       //可以理解么? 没事啊,到两个最长的地方,这个时候其实i,j是一样的,i,j都是同增的
        {
            if(!flag)                       //flag=0
            {
                xixi=a[i]+b[i];             //所以我们要把a,b数组赋予初值0,还没赋予
                ans[num++]=xixi%10;
                if(xixi/10>0){
                    flag=1;
                }
            }
            else{                           //需要进位;
                xixi=a[i]+b[i]+1;           //就加一了。
                ans[num++]=xixi%10;
                if(xixi/10>0){          //需要进位,
                    flag=1;
                }
                else{                   //不需要进位;
                    flag=0;             //前面不说这句话是因为前面的flag=0       这里可以不说flag=1;
                }
            }
        }
    
        //最后我们还要判断一下。是不是还有问题。。。为什么呢,可能最后也需要进位
        //我们的最高位是两个字符串的最高位 ,所以要是两个字符串的最高位相加还要进位。。。所以就要这样啊。
        if(flag==1){            //懂么,if(!flag) :这个意思是flag==0    if(flag) :这个意思是flag不等于0 ; //以后你再偷懒。
            ans[num++]=1;       //OK,模拟结束; 就是最高位 +1  因为进位只能进 1 ,直接 =1 了
        }
        //按照格式输出;
        //现在我们的ans 是从个位开始的。他的后面才是最高位,所以我们要从最高位输出;
        //这里输出啊。。。
        for(int i=num-1;i>=0;i--)
            printf("%d",ans[i]);        //什么声音????????????????????
        //不对,他还有,。。输出要求   。。。。。。。。。不打了。
         //没事啊,你放好l
         //ok
        //最后换个行就好了
        printf("
    ");
    }
    
    int main()
    {
        int cnt=1;
        int T;
        scanf("%d",&T);         //T组 那么也就是说最后一组后面不用输出空行。
        while(T--)
        {
                                //因为输入的话是2串数,对吧。我们又不能依靠int 或者 long long,所以只能用字符串输入方法
            scanf("%s%s",s1,s2);        //模拟一个加法,模拟每一位上的加法呀
            int len1,len2;
            len1=strlen(s1);        //这个是字符串的测量长度的。
            len2=strlen(s2);        //我们这样输进去两个字符串,是正的,意思是 123456789输进去,那么 s2[len2-1]='9' 这个是个位。对吧?
    
            /*
                        这里的 1/5都是最高位,对~~~,但是呢我们的字符串又是把最低位在n-1,要倒一下,存入数组。你回家了?我怎么听到了碗筷的声音!!!
            我来举个例子吧,s1:123456
                            s2:54789
            这样;我们模拟   =        你看的懂么
    
            */
            //我现在写存到数组里面去;
            cunru(len1,len2);
            printf("Case %d:
    ",cnt++);     //cnt是代表第几组啊
            printf("%s + %s = ",s1,s2);
            xixi_jiafa(len1,len2);
    
            if(T!=0){
                printf("
    ");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    [LeetCode] 329. Longest Increasing Path in a Matrix
    [LeetCode] 1180. Count Substrings with Only One Distinct Letter
    [LeetCode] 1100. Find K-Length Substrings With No Repeated Characters
    [LeetCode] 312. Burst Balloons
    [LeetCode] 674. Longest Continuous Increasing Subsequence
    [LeetCode] 325. Maximum Size Subarray Sum Equals k
    [LeetCode] 904. Fruit Into Baskets
    [LeetCode] 68. Text Justification
    [LeetCode] 65. Valid Number
    [LeetCode] 785. Is Graph Bipartite?
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934461.html
Copyright © 2011-2022 走看看