zoukankan      html  css  js  c++  java
  • Programming Ability Test学习 1022. D进制的A+B (20)

    1022. D进制的A+B (20)

    时间限制
    100 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

    输入格式:

    输入在一行中依次给出3个整数A、B和D。

    输出格式:

    输出A+B的D进制数。

    输入样例:
    123 456 8
    
    输出样例:
    1103
    

    提交代码

    //用的大数的方法,比较麻烦。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm> 
    #define MAXSIZE 100005
    #define Max 30
    using namespace std;
    
    //大数相加函数 
    char* bigAdd(char *str1,char *str2);
    //大数求余函数
    int getMod(char *str,int N);
    //大数除法函数
    char* getDivide(char *str,int N); 
    //判断除法最后的时刻,即得到的商小于N 
    bool JudgeStr(char* str)
    {
        int i=0;
        while(str[i]=='0')i++;
        if(str[i]!='0'&&i==strlen(str)-1)return true;
        else return false;
    } 
    bool JudgeEmp(char *str)
    {
        int i=0;
        while(str[i]=='0')i++;
        if(i>=strlen(str))return true;
        else return false;
    }
    
    int main()
    {
        char str1[Max],str2[Max];
        char *str4,*str5;
        int n;
        str4=bigAdd(str1,str2);//相加以后的数 
        scanf("%d",&n);
        if(JudgeEmp(str4)==true)cout<<"0"<<endl;//如果是得到的加数是0直接输出0 
        else{
        int a[Max];int i=0;
        while(JudgeStr(str4)==false)
        {
            a[i++]=getMod(str4,n);
            strcpy(str4,getDivide(str4,n));
        }
        
        int chushu=str4[strlen(str4)-1]-'0';
        while(chushu>=n){a[i++]=chushu%n;chushu=chushu/n;}
        a[i++]=chushu;
        //cout<<chushu<<endl;
        for(int j=i-1;j>0;j--)cout<<a[j];
        cout<<a[0]<<endl;
        }
     
        return 0;
    } 
    
    //大数除法
    char* getDivide(char *a,int bcs1)
    {
        int a1[1024];
        for(int i=0;i<strlen(a);i++){a1[i]=a[i]-'0';}
        
        char get1[1024];
        memset(get1,0,sizeof(get1));
        int mengduo=0;//余数 
        int y=0;
        for(int i=0;i<strlen(a);i++)
        {
        int k=mengduo*10+a1[i];
        int kk=k/bcs1;
        get1[y++]=kk+'0';
        mengduo=k%bcs1;
        }
        
        if(get1[0]=='0'){//如果得到的是00001234,只输出1234 
        int l=0;
        while(get1[l]=='0'&&get1[l+1]=='0')l++;
        if(l==strlen(get1)-1)printf("0");
        else{
        //for(int i=l+1;i<strlen(get1);i++)
        //printf("%c",get1[i]);
        return strdup(get1);
        }
        }
        else //得到的是12345诸如 
        {
        //for(int i=0;i<strlen(get1);i++)
        return strdup(get1);
        }
        
    } 
    
    
    
    
    //大数求余,同余法
    int getMod(char *str,int N)
    {
        int i, num, len;  
        num = 0;  
        len = strlen(str);  
        for(i = 0; i != len; ++i)  
        {  
            num = (num * 10 + (int)(str[i] - '0')) % N;   
        }  
        return num; 
        
    } 
    
    
    
    
    
    //以前的题目写过的大数相加改编的函数 
    char* bigAdd(char *str1,char *str2)
    {
        int cp;
        int j;
        char str4[Max],str5[Max],strtt[Max];
        memset(str1,0,sizeof(str1));
        memset(str2,0,sizeof(str2));
        memset(str4,0,sizeof(str4));
        memset(str5,0,sizeof(str5));
        memset(strtt,0,sizeof(strtt));
        int a,b,c;//字符串的长度 
        
        /**********如果不是负数就在前面加个'+'号***********/ 
        scanf("%s %s",str1,str2);
        if(str1[0]>='0'&&str1[0]<='9')
        {
        strtt[0]='+';
        strcat(strtt,str1);
        strcpy(str1,strtt);
        memset(strtt,0,sizeof(strtt));
        }
        if(str2[0]>='0'&&str2[0]<='9')
        {
        strtt[0]='+';
        strcat(strtt,str2);
        strcpy(str2,strtt);
        memset(strtt,0,sizeof(strtt));
        }
        
        //printf("%s %s %s
    ",str1,str2,str3);
        /**********把长度长的赋值给str4,短的给str5***********/ 
        a=strlen(str1);
        b=strlen(str2);
        
        if(a>=b){
        strcpy(str4,str1);
        strcpy(str5,str2);
        }
        else{
        strcpy(str4,str2);
        strcpy(str5,str1);
        }
        //printf("%s %s
    ",str4,str5);
        //printf("%d %d %d
    ",strlen(str1),strlen(str2),strlen(str3));
        
        cp=1;
        j=strlen(str5)-1;
        int strlen1=strlen(str4);
        int strlen2=strlen(str5);
        /**********如果str4,str5符号相同则相加***********/ 
        if(str4[0]==str5[0])
        {
        for(int i=strlen1-1;i>strlen1-strlen2;i--)
        {
        int temp,temp1,temp2;
        temp1=str4[i]-'0';
        
        temp2=str5[j]-'0';
        temp=temp1+temp2;
        if(cp==-1)temp++;
        if(temp>=10)
        {
        temp=temp%10;
        str4[i]=temp+'0';
        cp=-1;
        }
        else
        {
        str4[i]=temp+'0';
        cp=1;
        }
        j--;
        }
        
        // printf("%s
    ",str4);
        if(cp==-1)
        {
        for(int i=strlen(str4)-strlen(str5);i>0;i--)
        {
        int temp3=str4[i]-'0';
        if(cp==-1)temp3=temp3+1;
        if(temp3>=10)cp=-1;
        else cp=1;
        temp3=temp3%10;
        str4[i]=temp3+'0';
        }
        }
        // printf("%s
    ",str4);
        if(cp==-1)
        {
        strtt[0]='1';
        strcat(strtt,str4);
        strcpy(str4,strtt);
        char change=str4[0];
        str4[0]=str4[1];
        str4[1]=change;
        memset(strtt,0,sizeof(strtt));
        }
        // printf("相加后的数:");
        // printf("%s
    ",str4);
        }
        
        
        /**********去符号后的0,比如-999+999得到-000变为+0***********/ 
        int kk=strlen(str4);
        int ii=1;
        
        while(str4[ii]=='0'&&str4[ii+1]!='')
        {
        char change3=str4[0];
        str4[0]=str4[ii];
        str4[ii]=change3;
        int kk=strlen(str4);
        char ss[20];
        memset(ss,0,sizeof(ss));
        for(int m=0;m<kk-1;m++)
        ss[m]=str4[m+1];
        strcpy(str4,ss);
        }
        for(int ll=0;ll<strlen(str4)-1;ll++)
        str4[ll]=str4[ll+1];
        str4[strlen(str4)-1]='';
        
    //    printf("%s
    ",str4);
        return strdup(str4);
        
    }
    View Code
  • 相关阅读:
    对象池使用时要注意几点
    Flash3D学习计划(一)——3D渲染的一般管线流程
    714. Best Time to Buy and Sell Stock with Transaction Fee
    712. Minimum ASCII Delete Sum for Two Strings
    647. Palindromic Substrings(马拉车算法)
    413. Arithmetic Slices
    877. Stone Game
    338. Counting Bits
    303. Range Sum Query
    198. House Robber
  • 原文地址:https://www.cnblogs.com/a842297171/p/4778133.html
Copyright © 2011-2022 走看看