输入有多组数据。
每组数据包含两个正整数n (1≤n≤2147483647)和r (2≤n≤16)。
对应每一组数据,输出十进制正整数n转换成r进制后的数位和,并用r进制输出结果。
123456 10<br/>123456 2
21<br/>110
def baseN(num, b):
return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + "0123456789ABCDEFGHIGKLMNO"[num % b])
while True:
try:
a,b=map(int,input().split())
arr="0123456789ABCDEFGHIGKLMNO"
print(baseN(sum(map(lambda c:arr.index(c),list(baseN(a,b)))),b))
except:
break
#include<stdio.h>
int main()
{
int radix, sum, i, num[50];
long long int x;
while (~scanf("%lld%d", &x, &radix))
{
sum = 0;
while (x >= radix)
{
sum += (x%radix);
x /= radix;
}
sum += x;
i = 0;
while (sum >= radix)
{
num[i] = sum%radix;
sum /= radix;
i++;
}
num[i] = sum;
for (int j = i;j >= 0;j--)
{
if (num[j] < 10)
printf("%d", num[j]);
else
printf("%c", num[j] - 10 + 'A');
}
printf("\n");
}
return 0;
} // write your code here
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();
String str = Integer.toString(n,r);
char ch[] = str.toCharArray();
int result = 0;
for(int i = 0; i < ch.length; i++){
if(Character.isLetter(ch[i]))
result += (ch[i]-'a'+10);
else
result += (ch[i]-'0');
}
System.out.println(Integer.toString(result,r).toUpperCase());
}
sc.close();
}
}
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string tran(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;
}
string fun(int n,int m){
string tmp=tran(n,m);
int sum=0;
for(int i=0;i<tmp.size();i++){
if(tmp[i]>='0'&&tmp[i]<='9'){
sum+=(tmp[i]-'0');
}
else{
sum+=(tmp[i]-'A'+10);
}
}
return tran(sum,m);
}
int main(){
int n,m;
while(cin>>n>>m){
cout<<fun(n,m)<<endl;
}
return 0;
}
还是进制转换的题,这么多水题。。。
与上一题 PAT乙级(Basic Level)练习题 外星人的语言 几乎一毛一样。。。
#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) {
int resNum = 0;
string resStr = "";
//只要n!=0,则说明还需要进位转换
while (n != 0) {
//所有的余数即是进制转换后的结果
resNum += n % r;
n /= r;
}
//将resNum转换为r进制,可以封装成一个函数
while (resNum != 0) {
char ch = resNum % r;
//转换为响应的数字字符,超过10需要转成A、B、C等大写字母
if (ch > 9) {
ch += 'A' - 10;
} else {
ch += '0';
}
//逆序拼接,因为我们是从低到高位进行转换
resStr = ch + resStr;
resNum /= r;
}
//输出结果字符串
printf("%s\n", resStr.c_str());
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「hestyle」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://hestyle.blog.csdn.net/article/details/104660621
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char jz[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
//void exchange(char*, int*, int);//字符型转整形
void reverse(char*, int);//逆转数组
void change(int, char*, int);//进制转换,逆序存放
int main()
{
int n, r;
while(~scanf("%d %d", &n, &r))
{
char result_ch[100] = {0};
change(n, result_ch, r);
int len = strlen(result_ch);
reverse(result_ch, len);
int i = 0;
int sum = 0;
while(result_ch[i] != '\0')
{
if(result_ch[i] <= '9' && result_ch[i] >= '0')
sum += (result_ch[i] - '0');
else
sum += (result_ch[i] - 'A' + 10);
i++;
}
char s[100] = {0};
change(sum, s, r);
int len_s = strlen(s);
reverse(s, len_s);
printf("%s\n", s);
}
}
void reverse(char str[], int len)
{
for(int i = 0; i < len/2; i++)
{
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
void change(int n, char str[], int r)
{
int i = 0;
while(n)
{
str[i] = jz[n % r];
n /= r;
i++;
}
} static String getN(int num,int N){
//先求出所有数位和
int sum=0;
while (num != 0){
sum+=num%N;
num/=N;
}
//再将所有数位和加在一起
StringBuilder builder = new StringBuilder();
while (sum != 0){
builder.append(getR(sum,N));
sum/=N;
}
return builder.reverse().toString();
}
static char getR(int num,int n){
int r = num % n;
switch (r){
case 10:
return 'A';
case 11:
return 'B';
case 12:
return 'C';
case 13:
return 'D';
case 14:
return 'E';
case 15:
return 'F';
default:
return ((char) (r + 48));
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()){
int num = input.nextInt();
int N = input.nextInt();
System.out.println(getN(num,N));
}
} //先讲一下思路:n先做进制转换,进制转换的数一定要存在一个全局变量的数组里
//然后计算数组中数字的和,计算完之后记得要把计数(转换的数所要的空间,指下标)用的count清零
//然后将和进行进制转换
//再在最后进行输出,同时输出完一个结果记得把它所占数组的那个位置清零,方便下一次输出
#include<stdio.h>
int a[100]={0};
int count=0;
void num_change(int n,int r)
{
int i , tmp;
while(n)
{
tmp=n%r;
a[count++]=tmp;
n=n/r;
}
}
int sum(int a[])
{
int i,res=0;
for(i=0;i<count;i++)
{
res += a[i];
}
return res;
}
int main()
{
int n,r,result,i;
while(scanf("%d%d",&n,&r)!=EOF)
{
num_change(n,r);
result= sum(a);
count=0;
num_change(result,r);
for(i=count-1;i>=0;i--)
{
if(a[i]>=10)
{
printf("%c",a[i]+55);
}
else
{
printf("%d",a[i]);
}
a[i]=0;
}
printf("\n");
}
return 0;
} #include<iostream>
#include<stack>
using namespace std;
int main()
{
int n,r;
cin >> n>>r;
int x, y = 0;
int a[1000];
int sum = 0;
x = n;
while (x)
{
a[y] = x % r;
x /= r;
y++;
}
for (x = y - 1; x >= 0; x--)
sum += a[x];
int i, j = 0;
int b[1000];
i = sum;
while (i)
{
b[j] = i % r;
i /= r;
j++;
}
for (i = j - 1; i >= 0; i--)
cout << b[i];
return 0;}
为什么VS上运行输出的答案正确,牛客没有编译通过?
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
long long n;
int r;
while(~scanf("%lld %d",&n,&r)){
string s;
int a;//a表示每次除余的结果
while(n!=0){
a=n%r;
s+=(a+'0');
n=n/r;
}
int l; //l表示转化后的长度;
l=s.size();
int i;
int num=0;
for(i=0;i<l;i++){
num+=(s[i]-'0');//num是和
}
string res;
int b;
char cnt[6]={'A','B','C','D','E','F'};
while(num!=0){
b=num%r;
if(b<10){res+=(b+'0');}
else{
res+=cnt[b-10];
}
num=num/r;
}
reverse(res.begin(),res.end());
cout << res <<endl;
}
}
#include<stdio.h>
int main()
{ int input,redix; int dictionary[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
char list[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
char NowcoderResult[32]; while(scanf("%d %d", &input,&redix) != EOF) { int NowCoder = 0;
int i=0; while(input) { NowCoder += dictionary[input%redix]; input = input / redix; }
while(NowCoder)
{
NowcoderResult[i++]=list[NowCoder%redix];
NowCoder=NowCoder/redix;
}
i--;
for(;i>=0;i--)
{
printf("%c",NowcoderResult[i]);
NowcoderResult[i]=0;
}
printf("\n"); } return 0;
}
有点懒……转进制写成函数就好了,写出来太难看了
def jinzhi(num,n): s='0123456789ABCDEFG' out='' while num: out=s[num%n]+out num=num//n return out while True: try: s='0123456789ABCDEFG' x=list(map(int,input().split())) num=x[0] n=x[1] result=jinzhi(num,n) he=0 for i in result: he+=int(s.find(i)) print(jinzhi(he,n)) except: break
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long long num,R;
char trans[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(cin>>num>>R)
{
long long sum=0;
stack<int> s;
while(num!=0)
{
sum+=num%R;
num/=R;
}
while(sum!=0)
{
s.push(sum%R);
sum/=R;
}
while(!s.empty())
{
cout<<trans[s.top()];
s.pop();
}
cout<<endl;
}
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++)
{
count += out[j];
/*
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();
n = count;
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;
}
for (int j = 0; j < out.size(); j++)
{
//count += out[j];
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();
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
while(read.hasNextInt()) {
int n = read.nextInt();
int r = read.nextInt();
String s = count(n , r);
char[] x = s.toCharArray();
int sum = 0;
for(int i = 0; i < x.length; i++) {
if((x[i] - '7') > 9) {
sum += x[i] - '7';
} else {
sum += (x[i] - '0');
}
}
s = count(sum, r);
System.out.println(s);
}
}
static String count(int n, int r) {
StringBuffer s = new StringBuffer();
while(n != 0) {
if(n % r > 9) {
s.append((char)((n % r) + 55));
} else {
s.append(n % r);
}
n = n / r;
}
s.reverse();
String ss = s.toString();
return ss;
}
}
//题目都没有讲清楚最大为16进制,试了试16进制就可以了...#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 sum=0;int len = Switch(n, r, a);for(i=0;i<len;i++){sum += a[i];}len = Switch(sum, r, a);for(i=len-1;i>=0;i--){if(a[i]>9){switch(a[i]){case10:printf("A");break;case11:printf("B");break;case12:printf("C");break;case13:printf("D");break;case14:printf("E");break;case15:printf("F");break;}}else{printf("%d", a[i]);}}printf("\n");}return0;}int Switch(int n, int r, int *a){int i=0;while(n!=0){a[i] = n % r;i++;n /= r;}return i;}
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
void change(const long& num, const int& r, vector<int>& v1){
long num_temp = num;
while(num_temp!=0){
v1.push_back(num_temp % r);
num_temp = num_temp / r;
}
}
int cal_sum(const vector<int>& v1){
int result = 0;
for(auto iter = v1.begin(); iter != v1.end(); iter++){
result += *iter;
}
return result;
}
void show(const vector<int>& v1){
for(auto iter = v1.crbegin(); iter != v1.crend(); iter++){
if(*iter >= 10)
printf("%c", 'A'+(*iter-10));
else
cout << *iter;
}
cout << endl;
}
int main(){
int n, R;
while(scanf("%d %d", &n, &R)!=EOF){
vector<int> v;
int sum_temp;
change(n, R, v);
sum_temp = cal_sum(v);
v.clear();
change(sum_temp, R, v);
show(v);
}
return 0;
}
#include<stdio.h>
#include<iostream>
using namespace std;
int conv(int n,int r,int *a,int &sum)
{
int len=0;
while(n)
{
a[len]=n%r;
n/=r;
sum+=a[len++];
}
return len;//返回长度
}
int main()
{
int n,r,i,len,sum=0,f;
int a[32];
char b[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(cin>>n>>r)
{
sum=0;
len=conv(n,r,a,sum);
len=conv(sum,r,a,f);//把数字之和sum再转换成r进制数
for(i=len-1;i>=0;i--)
cout<<b[a[i]];
cout<<endl;
}
return 0;
}
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int num, cnt;
char NUM[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
while (cin >> num >> cnt)
{
int sum = 0;
while (num)
{
sum += num%cnt;
num /= cnt;
}
vector<int> data;
while (sum)
{
data.push_back(sum%cnt);
sum /= cnt;
}
reverse(data.begin(), data.end());
for (vector<int>::iterator it = data.begin(); it != data.end(); it++)
cout << NUM[*it];
cout << endl;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void exchange(int num, int jinzhi, char *res,int *sum) {
int weishu = 0;
while (pow(jinzhi, weishu) <= num) weishu++;
weishu--;
res = (char *)realloc(res,(weishu + 2)*sizeof(char));
res[weishu + 1] = '\0';
for (int i = weishu; i > 0; i--) {
int wei = num / pow(jinzhi, i);
*sum += wei;
char bit;
if (wei>9) bit = wei + 55;
else bit = wei + 48;
res[weishu - i] = bit;
num -= wei*pow(jinzhi, i);
if (num == 0) {
memset(res + weishu - i + 1, '0', i);
break;
}
}
res[weishu] = (num>9 ? (num + 55) : (num + 48));
*sum += num;
}
int main()
{
int n, r;
while (~scanf("%d%d", &n, &r)) {
int weishuhe = 0; char *result = (char *)calloc(1,sizeof(char));
exchange(n, r, result, &weishuhe);
int usls = 0; memset(result, '0', sizeof(result));
exchange(weishuhe, r, result, &usls);
puts(result);
free(result); result = NULL;
}
return 0;
}