输入有多行。
每行包括两个正整数n和R,其中2≤R≤16。
输入直到文件结束为止。
对于每个用例,输出n对应的R进制形式。
超过10进制的数,10用A表示、11用B表示,依次类推。
1989 2<br/>1119 16
11111000101<br/>45F
#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; }
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))
#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; }
#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; }
直接用BigInteger类转化进制,然后化成大写字母
#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; }
又是水题一道。。。
模拟手动进制转换即可,不过注意超过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
#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]]; }
#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; }
#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;
}
思路:上一题基本没有改动就能用。 #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; } }
#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; }
代码是第一名,看来还是简短的代码效率比较高,以后追求代码的最优化。这题很常规,典型的进制转换题目,考研机试就有啊!
//简单清晰明了才是最重要的#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;}
#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; }