Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18676 Accepted Submission(s): 7344 Problem Description 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。 Input 输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
Output 输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
Sample Input 8 1300 48 2 1 7 0
Sample Output 2504 1000
Author ZJU
Source |
题记:
这道题坑的是数的范围太大了,要用数组!
下面给出的方法一只适用于数小的情况,提交会wrong answer。
方法二使用了数组,提交100分。
方法一:(C++)
#include <iostream>
typedef unsigned long long ULL;
using namespace std;
ULL convert(ULL n, int base){
ULL digit=0;
int power=1;
while(n){
digit += power * (n%base);
n /= base;
power *= 10;
}
return digit;
}
int main(void){
ULL m, a, b, sum;
while(cin >> m ){
if(m == 0)
break;
else{
cin >> a >> b;
sum = a+b;
cout << convert(sum, m) << endl;
}
}
return 0;
}
方法二:(c)
#include <stdio.h>
void reverse(char s[], int len)
{
int i,j;
int c;
for(i=(s[0]=='-'?1:0),j=len-1; i<j;i++,j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void convert(int n, int base, char *t)
{
char *p = t;
// 处理值为0的情况
if(n == 0)
*p++ = '0';
while(n) {
*p = n % base;
if(*p >= 10)
*p = *p - 10 + 'A';
else
*p = *p + '0';
n /= base;
p++;
}
*p = '\0';
reverse(t, p-t);
}
int main()
{
int m, a, b;
char t[64];
while(scanf("%d", &m) != EOF) {
if(m == 0)
break;
scanf("%d%d", &a, &b);
convert(a+b, m, t);
printf("%s\n", t);
}
return 0;
}