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
原文地址:https://www.cnblogs.com/a842297171/p/4778133.html