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
  • 相关阅读:
    centos6和centos7升级openssh7.5脚本
    开通telnet服务,使用telnet登入
    彻底删除kafka的topic以及其中的数据
    redis集群创建
    curl 命令参数
    nginx.conf配置文件详解,白嫖的
    logstash迁移es数据
    es 常用查询
    pl/sql 存储过程
    es查看集群信息命令_cat和_cluster
  • 原文地址:https://www.cnblogs.com/a842297171/p/4778133.html
Copyright © 2011-2022 走看看