输入有多组数据。
每组数据包含两个正整数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; }