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
//用的大数的方法,比较麻烦。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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); }