您的位置:首页 > 其它

Programming Ability Test学习 1022. D进制的A+B (20)

2015-09-02 11:39 459 查看

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\n",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\n",str4,str5);
//printf("%d %d %d\n",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\n",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\n",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\n",str4);
}

/**********去符号后的0,比如-999+999得到-000变为+0***********/
int kk=strlen(str4);
int ii=1;

while(str4[ii]=='0'&&str4[ii+1]!='\0')
{
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]='\0';

//    printf("%s\n",str4);
return strdup(str4);

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: