首页 > 试题广场 >

又一版 A+B

[编程题]又一版 A+B
  • 热度指数:17608 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。

输入描述:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。


输出描述:
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
示例1

输入

8 1300 48
2 1 7
0

输出

2504
1000

python解法,简单易懂,写了个进制转换的函数。

def baseN(num, b):
    return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])


while True:
    try:
        a = input()
        if a != "0":
            jinzhi, num1, num2 = map(int, a.split())
            print(baseN((num1 + num2), jinzhi))

    except:
        break
发表于 2017-10-06 22:11:42 回复(0)
牛客网和PAT的OJ判断结束方式不一样,比如这道题,PAT原题是以m = 0结尾,而牛客上实际是没有m = 0的案例的(事实上连多组数据都没),要加循环则必须用while(scanf("%d",&m)!=EOF),中途加判断m=0跳出的话会陷入死循环超时,所以干脆布甲循环
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;


int main() {
	long long a, b;
	int m;

	scanf("%d", &m);
	scanf("%lld %lld", &a, &b);
	a += b;
	string str;
	if (a == 0) str = "0";
	else {
		while (a) {
			str.push_back(char(a % m + '0'));
			a /= m;
		}
		reverse(str.begin(), str.end());
	}
	cout << str << endl;

	return 0;
}


编辑于 2020-03-04 18:22:57 回复(1)
#include<stdio.h>
int main (){//the shorter,the better.
    int A,B,m,i,r[100];long t;
    for(;~scanf("%d",&m)&&m&&~scanf("%d%d",&A,&B);){
        for(*r=t=A+B,i=0;t;r[i++]=t%m,t/=m);
        for(i<=0?:--i;printf(i==0?"%d\n":"%d",r[i])&&i;--i);
    }
}

发表于 2018-01-14 20:44:47 回复(1)
#include <stdio.h>   

int ans[70];         

int m;               
long a, b, c;        

int main()           
{                                  
    while (scanf("%d", &m) != EOF && m != 0)
    {                
        scanf("%ld %ld", &a, &b);
        c = a + b;   
        int num = 0;  
        do           
        {            
           ans[num++] = c % m;  
           c /= m;   
        }while(c != 0); 
        for (int i = num - 1; i >= 0; i--)
            printf("%d", ans[i]);
        printf("\n");                                                                                                                                         
    }                
    return 0;        
} 
发表于 2022-03-10 12:00:27 回复(0)
#include<cstdio>
#include<iostream>
#include<vector>

using namespace std;
int main(){
    unsigned m,a,b,sum;

    while(scanf("%d%d%d",&m,&a,&b)!=EOF){
        if(m==0) break;
        sum=a+b;
        if(sum==0) cout<<0<<endl;//是不是忘记了,,,
        vector<int> binary;
        while(sum!=0){
            binary.push_back(sum%m);
            sum/=m;
        }
        for(int i=binary.size()-1;i>=0;--i){
            printf("%d",binary[i]);
        }
        printf("\n");
    }
    return 0;
}


发表于 2021-03-12 16:54:25 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;

vector<int> myVector;

void convert(long long ret, int m)
{
    if (ret == 0)
    {
        myVector.push_back(0);
    }
    while (ret)
    {
        myVector.push_back(ret % m);
        ret /= m;
    }
    for (int i = myVector.size() - 1; i >= 0; i--)
    {
        printf("%d", myVector[i]);
    }
    cout << endl;
}

int main()
{
    int m;
    long long A, B;
    while (cin >> m)
    {
        if (m == 0)
        {
            break;
        }
        cin >> A >> B;
        convert(A + B, m);
        myVector.clear();
    }
    return EXIT_SUCCESS;
}

发表于 2021-02-18 17:18:01 回复(0)
简单 注意A+B不要越界用unsigned int即可

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,a,b;
    while(cin>>n>>a>>b&&n!=0)
    {
        unsigned int c=a+b;
        if(c)
        {
            string s="";
            while(c!=0)
            {
                int tmp=c%n;
                c/=n;
                s=to_string(tmp)+s;
            }
            cout<<s<<endl;
        }
        else cout<<0<<endl;
    }
}


发表于 2021-01-29 19:41:33 回复(0)
#include<stdio.h>
int main()
{
    int a,b,m,w[100]={0},num,i;
    long int c;//可能超出int 所以用long修饰c
    while(scanf("%d",&m)!=EOF)
    {
        if(m==0) break;
        scanf("%d%d",&a,&b);
        c=a+b;num=0;
        if(c==0)
        {
         printf("0");continue;   
        }
        while(c!=0)
        {
            w[num]=c%m;
            c/=m;
            num++;
        }
		for(i=num-1;i>=0;i--)
			printf("%d",w[i]);
        printf("\n");
    }
	return 0;
}

发表于 2020-04-16 15:26:17 回复(0)
/*
案例给的数加起来应该是超过int的了,不过我直接用long long了,先存到栈里面,然后顺序输出即可
*/
#include <bits/stdc++.h>
using namespace std;
int main(){
    long long m,a,b;
    while(cin>>m>>a>>b){
        if(m==0) break;
        long long c = a+b;
        stack<int> res;
        do{
            res.push(c%m);
            c/=m;
        }while(c!=0);
        while(!res.empty()){
            cout<<res.top();
            res.pop();
        }
        cout<<endl;
    }
}

发表于 2020-03-03 08:34:12 回复(0)
#include <iostream>
using namespace std;
int main()
{
	unsigned int scale = 0, a = 0, b = 0;
	while(cin>>scale && 0 != scale && cin >> a >> b)
	{ 
		unsigned int c = a + b, nums[32] = { 0 }, cnt = c ? 0 : 1;
		while (c) { nums[cnt++] = c % scale; c = c / scale; }
		while (cnt--) { cout << nums[cnt]; } cout << endl;
	}
	return 0;
}

发表于 2020-02-20 10:18:19 回复(0)
//就是要注意数的范围,为了避免溢出,应该用unsigned int来存储a和b的和
#include<iostream>
using namespace std;
int main(){
    int m,a,b;
    while(cin>>m>>a>>b){
        if(m==0)
            break;
        unsigned int c=a+b,out[100],count=0;//注意c用unsigned来存储,否则大数加***得到负值
        if(c==0)
            cout<<"0"<<endl;
        else{
            while(c>0){
                out[count++]=c%m;
                c/=m;
            }
            for(int i=count-1;i>=0;i--)
                cout<<out[i];
            cout<<endl;
        }
    }
}


发表于 2020-01-12 20:53:23 回复(0)
用do while做的话可以将特殊情况也处理掉
#include<stdio.h>
int main(){
    int a,b,m;
    int ans[20];
    int size=0;
    while(scanf("%d%d%d",&m,&a,&b)!=EOF){
        if(m==0)
            break;
        long num=a+b;
        do{
            ans[size++]=num%m;
            num/=m;
        }while(num!=0);
        for(int i=size-1;i>=0;i--)
        printf("%d",ans[i]);
    }
    return 0;
}

发表于 2019-03-09 19:05:40 回复(0)
def conversion(num,m):    #进制转换,最多转换三十六进制吧
    baseChar = "0123456789abcdefghijklmnopqrstuvwxyz"
    tempNum = num
    if num==0:
        return 0
    result = []
    while tempNum>0:
        tempNum,b = divmod(tempNum,m)
        result.append(baseChar[b])
    return "".join(result[::-1])

while True:
    try:
        digitList = list(map(int,input().split()))
        if digitList[0]==0:
            break
        print(conversion(digitList[1]+digitList[2],digitList[0]))
    except Exception:
        break

编辑于 2018-09-20 23:46:56 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        long m = scan.nextLong();
        if (m == 0)
            return;
        long A = scan.nextLong(), B = scan.nextLong();
        long C = A + B;
        if (C == 0) {
            System.out.print(0);
            return;
        }
        String res = "";
        while (C > 0) {
            res = (C % m) + res;
            C /= m;
        }
        System.out.print(res);
    }
}


编辑于 2018-03-19 10:32:22 回复(0)
//一定要用do while 防止a=0,b=0时跳过输出。
#include<stdio.h>
int main() {
    long long a, b;
    int m;
    while (scanf("%d",&m) != EOF&&m) {
        scanf("%lld%lld", &a, &b);
        a = a + b;
        int AB[30],i = 0;
        do{
            AB[i] = a % m;
            a /= m;
            i++;
        } while (a);
        i--;
        while (i >= 0) {
            printf("%d", AB[i]);
            i--;
        }
        printf("\n");
    }
    return 0;
}

发表于 2018-03-04 19:40:15 回复(0)
我直接用long long类型来保存a, b的值了,肯定不会加法溢出的。
一开始,没有对a = 0 b = 0这种特殊情况做单独判断,结果case通过率为90%,后来加入这个特殊判定后,就AC了。
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn = 100;

int main() {
    LL a, b;
    LL m;
    int arr[maxn];
    while (cin >> m >> a >> b) {
        if (m == 0) break;
        LL sum = a + b;
        if (sum == 0) cout << 0 << endl;
        else {
            int index = 0;
            while (sum != 0) {
                arr[index++] = sum % m;
                sum /= m;
            }

            for (int i = index-1; i >= 0; i--) {
                cout << arr[i];
            }
            cout << endl;

        }
    }



    return 0;
}


发表于 2018-06-01 16:32:50 回复(0)
切记A和B要用unsigned类型来存储,用int的话这道题会溢出(别问我为什么知道)
#include <stdio.h>
#define N 1000

int Devide(unsigned n, unsigned m, unsigned buf[N])
{
    int i;
    for(i=0 ;i<N; i++) buf[i]=0;
    i=0;
    while(n>=m)
    {
        buf[i]=n%m;
        n/=m;
        i++;
    }
    buf[i]=n;
    return i;//返回最高位的位置
}

int main()
{
    unsigned a, b;
    unsigned m, buf[N];
    int i, pos;
    while(scanf("%d", &m)!=EOF)
    {
        if(m==0) break;
        scanf("%d %d", &a, &b);
        pos=Devide(a+b, m, buf);
        for(i=pos; i>=0; i--) printf("%d", buf[i]);
        printf("\n");
    }
    return 0;
}
发表于 2018-02-07 09:33:58 回复(5)
10进制→m进制,与10进制→2进制、10进制→8进制 思路完全相同。
注意边界条件:①m为0 ②A、B均为0 ③A、B或res,超过int范围,应改为long long

#include <iostream>
#include <vector>
using namespace std;

int main(){
    int m;
    long long A,B;
    while(cin >> m >> A >> B){
        if(m == 0) break;
        if(A == 0 && B == 0){
            cout << 0 << endl;
            break;
        }
        long long num = A + B, res = 0, remain = 0;
        //10进制转m进制
        vector<int> vec;
        while(num > 0){
            remain = num % m;
            vec.push_back(remain);
            num /= m;
        }
        for(int i = vec.size()-1; i >= 0; i--){
            cout << vec[i];
        }
        cout << endl;
    }
    return 0;
}


编辑于 2024-03-07 11:20:10 回复(0)
Java
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        BigInteger a = scanner.nextBigInteger();
        BigInteger b = scanner.nextBigInteger();
        System.out.println(a.add(b).toString(m));

    }
}


发表于 2020-03-19 13:33:23 回复(0)
#include <iostream>
#include<stack>
using namespace std;

int main() {
    int m,a,b;
    while(cin>>m&&m!=0){
        cin>>a>>b;
        long long temp=a+b;
        stack<int> s;
        if(temp==0)
            cout<<0;
        while(temp!=0){
            s.push(temp%m);
            temp/=m;
        }
        while(!s.empty()){

            cout<<s.top();
            s.pop();

        }
        cout<<endl;
    }
    return 0;
}

发表于 2024-03-24 21:13:02 回复(0)

问题信息

难度:
77条回答 7153浏览

热门推荐

通过挑战的用户

查看代码