首页 > 试题广场 >

外星人的语言

[编程题]外星人的语言
  • 热度指数:3831 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
nowcoder费了很大劲,终于和地外文明联系上。我们地球人通常有10根手指,因此我们习惯用10进制的数,而外星人的手指有16跟、8根等不等的数目,因此他们使用与我们不同的进制。为了方便沟通,需要你开发一款工具,把地球人的10进制转换成外星人的R进制形式。

输入描述:
输入有多行。
每行包括两个正整数n和R,其中2≤R≤16。
输入直到文件结束为止。


输出描述:
对于每个用例,输出n对应的R进制形式。
超过10进制的数,10用A表示、11用B表示,依次类推。
示例1

输入

1989 2<br/>1119 16

输出

11111000101<br/>45F
L0L头像 L0L
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string	fun(int n,int m){
	string ret;
	int t;
	while(n!=0){
		t=n%m;
		n/=m;
		if(t<10)    ret+=(t+'0');
		else    ret+=(t-10+'A');
	}
	reverse(ret.begin(),ret.end());
	return ret;
}
int main(){
	int n,m;
	while(cin>>n>>m){
		cout<<fun(n,m)<<endl;
	}
	return 0;
}


发表于 2015-11-20 14:57:47 回复(0)

python solution:

import sys

#这个函数的作用是将一个十进制数转为N进制的数。
def baseN(num, b):
    return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ"[num % b])


for i in sys.stdin.readlines():
    num, b = map(int, i.split())
    print(baseN(num, b))
发表于 2017-11-17 10:17:17 回复(0)
//只需一行Code即可秒杀!
importjava.util.Scanner;
 
publicclassMain {
    publicstaticvoidmain(String[] args) {
        Scanner in = newScanner(System.in);
        while(in.hasNext()){
            System.out.println(Integer.toString(in.nextInt(), in.nextInt()).toUpperCase());
        }
    }
}

发表于 2017-07-20 09:03:24 回复(1)
C++最简写法,指正
#include<iostream>
using namespace std;
int main(int argc, char** argv){
    char data[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    int n,r;
    while(cin >> n >> r){ 
            string res="";
      while(n>0){ res = data[n%r]+res; n/=r; }
      cout << res << endl;
    }
    return 0;
}
编辑于 2022-01-10 17:33:30 回复(0)
#include<iostream>
#include <algorithm>
using namespace std;
int main() {
    string a[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    string b;
    int n,r,temp;
    while(cin>>n>>r) {
        b="";
        while(n) {
            temp=n%r;
            b.append(a[temp]);
            n=n/r;
        }
        reverse(b.begin(),b.end());
        cout<<b<<endl;
    }
    return 0;

发表于 2019-07-30 10:27:42 回复(0)
#include <iostream>
#include <stack>
using namespace std;
char trans[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
void one(long long n, int r)
{
    int temp = 0, ans = 0;
    stack<int> sta;
    while (n != 0)
    {
        temp = n % r;
        sta.push(temp);
        n = n / r;
    }
    while (!sta.empty())
    {
        temp = sta.top();
        sta.pop();
        cout << trans[temp];
    }
    cout << endl;
}
int main()
{
    long long n = 0;
    int r = 0;
    while (cin >> n >> r)
    {
        one(n, r);
    }
    return 0;
}

发表于 2018-08-17 20:18:15 回复(2)
import java.math.*;
import java.io.*;

import java.util.*;
public class Main{
    public static void main(String[] argc)
    {
        BigInteger a;int r;String ans;
        Scanner s =new Scanner(System.in);
        while(s.hasNext())
        {
            a = s.nextBigInteger();
            r = s.nextInt();
            ans = a.toString(r);
            ans = ans.toUpperCase();
            System.out.println(ans);
        }
    }
}
直接用BigInteger类转化进制,然后化成大写字母

发表于 2016-09-10 22:32:57 回复(1)
#include<iostream>
#include<cmath>
int main()
{
  using namespace std;
  int n,R;
  while (cin >> n >> R)
  {
    int max_exp = 0;
    while (n / (int)pow(R, max_exp))
      ++max_exp;
    if (max_exp > 0) --max_exp;
    do
    {
      switch (n / (int)pow(R, max_exp))
      {
        case 10 : cout << "A";break;
        case 11 : cout << "B";break;
        case 12 : cout << "C";break;
        case 13 : cout << "D";break;
        case 14 : cout << "E";break;
        case 15 : cout << "F";break;
        default : cout << n / (int)pow(R, max_exp);break;
      }
      n = n % (int)pow(R, max_exp);
      --max_exp;
    } while (max_exp >= 0);
    cout << endl;
  }
  return 0;
}

编辑于 2015-10-12 16:29:49 回复(0)


又是水题一道。。。
模拟手动进制转换即可,不过注意超过10需要用大写字母A、B、C等来表示。

#include <iostream>
(720)#include <string>
using namespace std;

int main(int argc, const char * argv[]) {
    int n = 0, r = 0;
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d %d", &n, &r) != - 1) {
        string resStr = "";
        //只要n >= r,则说明还需要进位转换
        while (n != 0) {
            char ch = n % r;
            //转换为响应的数字字符
            if (ch > 9) {
                ch += 'A' - 10;
            } else {
                ch += '0';
            }
            //逆序拼接,因为我们是从低到高位进行转换
            resStr = ch + resStr;
            n /= r;
        }
        //如果最后剩下了,则进制转换后最高位为1
        printf("%s\n", resStr.c_str());
    }
    return 0;
}
————————————————
版权声明:本文为CSDN博主「hestyle」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://hestyle.blog.csdn.net/article/details/104660206
发表于 2020-03-04 19:17:23 回复(0)
#include <stdio.h>
#include <stdlib.h>
 
char jz[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
void reverse(int*, int);//翻转
 
void exchange(char*, int*, int);//数字变字符
 
int main()
{
    int n, r;
     
    while(~scanf("%d %d", &n, &r))
    {
        char result[100] = {0};
        int temp[100] = {0};
        int i = 0;
        while(n)
        {
            temp[i] = n % r;
            n = n/r;
            i++;
        }//i = length(temp)
        //int result1[100] = {0};
        reverse(temp, i);
        exchange(result, temp, i);
        printf("%s\n", result);
    }
}
 
void reverse(int a[], int n)
{
    for(int i = 0; i < n/2; i++)
    {
        int temp = a[n - i - 1];
        a[n - i - 1] = a[i];
        a[i] = temp;
    }
}
 
void exchange(char s[], int a[], int n)
{
    for(int i = 0; i < n; i++)
        s[i] = jz[a[i]];
}

编辑于 2020-03-03 13:01:11 回复(0)
#include<stdio.h>

int main(){
    int n,r,i = 0,j;
    int arr[100],num;
    while(scanf("%d%d",&n,&r)!=EOF){
        i = 0;
            while(n>=r){
               arr[i] = n%r;
                n = n/r;
                i++;
            }
            arr[i] = n;
            for(j = i;j>=0;j--){
                if(arr[j]<10)
                {
                    printf("%d",arr[j]);
            }
             else if(arr[j]==10){
                printf("A");
            }
            else if(arr[j]==11){
                printf("B");
            }
                        else if(arr[j]==12){
                printf("C");
            }            else if(arr[j]==13){
                printf("D");
            }
                        else if(arr[j]==14){
                printf("E");
            }
                        else if(arr[j]==15){
                printf("F");
            }   
    }
        printf("\n");
    }
    return 0;
}

发表于 2020-01-28 17:02:41 回复(0)
//1017.外星人的语言
#include <cstdio>
#include <cstring>
int main() 
{
    int n,r; //ASCII码表 '0'-48 'A'-65 'a'-97
    char a[6]={'A','B','C','D','E','F'};
    while(~scanf("%d%d",&n,&r)){
        char b[20]={0},i=0;
        while(n>=1){
            int t=n%r;
            if(t<10) b[i]=t+'0';
            else b[i]=a[t-10];
            n=n/r;
            i++;
        }
        for(int j=strlen(b)-1;j>=0;j--)
            printf("%c",b[j]);
        printf("\n");
    }
    return 0;
}
发表于 2019-01-26 20:54:52 回复(0)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int> vec;
void fun(int a){
    if(a<10) cout<<a;
    else{
        a-=10;
        cout<<(char)('A'+a);
    }
}
int main() {
    long long n,r;
    while(cin>>n>>r) {
        vec.clear();
        long long R=1;
        while(R<n) R*=r;
        while(R>0) {
           vec.push_back(n/R);
           n%=R;
           R/=r;
        }
        auto i = vec.begin();
        while(*i==0) i++;
        for(;i<vec.end();i++) fun(*i);
        cout<<endl;
    }
    return 0;
}



发表于 2018-11-20 16:54:30 回复(0)
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;//进制转化问题 
int main()
{
 char trans[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 int num,R;
 while(cin>>num>>R)
 {
  stack<int> s;
  while(1)
  {
   int num1;
   num1=num%R;
   s.push(num1);
   num/=R;
   if(num<R)
   {
    s.push(num);
    break;
   }
  }
  while(!s.empty())
  {
   int temp=s.top();
   cout<<trans[temp];
   s.pop();
  }
 }
 return 0;
  
} 

发表于 2018-08-29 22:21:03 回复(2)
思路:上一题基本没有改动就能用。
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

int main()
{
    int n, r;
    int i = 0;
    char ascii[] = { 'A','B','C','D','E','F' };
    vector<int> out;
    while (cin >> n >> r)
    {
        i = 0;
        while (n)
        {
            i++;
            int tempR = pow(r, i);
            int temp = n - (n / tempR)*tempR;
            out.push_back(temp / (pow(r, i - 1)));
            n = n - temp;
            //cout << temp / (pow(r, i - 1) )<< endl;
        }
        int count = 0;
        for (int j = 0; j < out.size(); j++)
        {
            if (out[j] == 1)
            {
                count++;
            }
            
            if (out[out.size() - j - 1] >= 10)
            {
            cout << ascii[out[out.size() - j - 1] - 10];
            }
            else
            cout << out[out.size() - j - 1];
            if (j == out.size() - 1)
            {
            cout << endl;
            }
            
        }
        out.clear();
        //cout << count << endl;
    }
}

发表于 2018-08-12 17:24:30 回复(0)
#include<iostream>

int main(){
    int n,r;
    int i;
    while(scanf("%d %d",&n,&r)!=EOF){
        char a[100];
        i=0;
        while(n){
            a[i]=n%r;
            n/=r;
            i++;
        }
        for(int j=i-1;j>=0;j--){
            if(a[j]<10)
                printf("%c",a[j]+'0');
            else
                printf("%c",(a[i]-10)+'A');
        }
        printf("\n");
    }
    return 0;
}

这是为什么啊???
求路过的大神帮忙解答
发表于 2018-01-25 15:50:28 回复(0)
#include <cstdio>
int main(){
    int n,r;
    while(scanf("%d%d",&n,&r)==2){
        char a[40],num=0;
        do{
            int x=n%r;
            a[num++]=x<10?x+'0':x-10+'A';
            n/=r;
        }while(n);
        for(int i=num-1;i>=0;i--) printf("%c",a[i]);
        printf("\n");
    }
    return 0;
}
代码是第一名,看来还是简短的代码效率比较高,以后追求代码的最优化。这题很常规,典型的进制转换题目,考研机试就有啊!

发表于 2017-12-05 08:55:10 回复(0)
//简单清晰明了才是最重要的
#include <stdio.h>
int Switch(int n, int r, int *a);
int main()
{
    int n;
    int r;
    int i;
    int a[10000];
    while(scanf("%d %d", &n, &r)!=EOF)
    {
        int len = Switch(n, r, a);
        for(i=len-1;i>=0;i--)
        {
            if(a[i]<10)
            {
                printf("%d", a[i]);
            }
            else
            {
                printf("%c", a[i]);
            }
        }
        printf("\n");
    }
    return0;
}
int Switch(int n, int r, int *a)
{
    int i=0;
    int tmp;
    while(n!=0)
    {
        tmp = n % r;
        if(tmp>9)
        {
            switch(tmp)
            {
                case10:
                    a[i] = (int)'A';
                    break;
                case11:
                    a[i] = (int)'B';
                    break;
                case12:
                    a[i] = (int)'C';
                    break;
                case13:
                    a[i] = (int)'D';
                    break;
                case14:
                    a[i] = (int)'E';
                    break;
                case15:
                    a[i] = (int)'F';
                    break;
            }
        }
        else
        {
            a[i] = tmp;
        }
        i++;
        n /= r;
    }
    return i;
}

发表于 2017-11-27 23:54:34 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int r = sc.nextInt();
            System.out.println(method(n, r));
        }
    }
    public static String method(int n, int r){
        if(n < r){
            if(n >= 10){
                return (char)(n-10+'A') + "";
            }
            return n + "";
        
        StringBuffer sb = new StringBuffer();
        int k = 0;
        while(n >= r){
            k = n % r;
            if(k >= 10){
                sb.append((char)(k-10+'A'));
            } else {
                sb.append(k);
            }
            n = n / r;
        }
        if(n != 0){
            sb.append(n);
        }
        return sb.reverse().toString();
    }
}
发表于 2017-10-03 12:49:37 回复(0)
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

int main(){
	int n, R;
	char out_d = 'A';
	vector<int> v;
	while(scanf("%d %d", &n, &R)!=EOF){
		v.clear();
		while(n!=0){
			v.push_back(n % R);
			n = n / R;
		}
		for(auto iter = v.crbegin();iter!=v.crend();iter++){
			if(*iter >= 10)
				printf("%c", out_d + (*iter - 10));
			else
				cout << *iter;
		}
		cout << endl;
	}
	return 0;
}

发表于 2017-07-22 14:44:18 回复(0)