首页 > 试题广场 >

数位和

[编程题]数位和
  • 热度指数:3831 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
把一个整数的各位累加,NowCoder称它为“数位和”。例如正整数123456的数位和是1+2+3+4+5+6=21。现在,请你帮忙计算一个整数n在r进制下的数位和,并用相应的进制输出结果。

输入描述:
输入有多组数据。
每组数据包含两个正整数n (1≤n≤2147483647)和r (2≤n≤16)。


输出描述:
对应每一组数据,输出十进制正整数n转换成r进制后的数位和,并用r进制输出结果。
示例1

输入

123456 10<br/>123456 2

输出

21<br/>110

python solution

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
发表于 2017-10-11 06:33:08 回复(1)
#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;
}

发表于 2017-08-04 16:20:45 回复(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();
    }
}

发表于 2018-01-02 16:30:08 回复(0)
L0L头像 L0L
#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;
}


发表于 2015-11-20 15:06:13 回复(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
发表于 2020-03-04 19:40:02 回复(0)
#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++;
    }
}

编辑于 2020-03-03 16:51:36 回复(0)
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));
        }

    }

发表于 2019-08-26 21:20:16 回复(0)
//先讲一下思路: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;
}

发表于 2019-07-18 20:14:52 回复(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上运行输出的答案正确,牛客没有编译通过?

发表于 2019-07-18 18:33:15 回复(0)
因为水平比较菜,所以代码写得比较乱。不过思路是最简单的思路了。
#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;
    }
}

发表于 2019-05-28 16:56:20 回复(0)
#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;
}
有点懒……转进制写成函数就好了,写出来太难看了
发表于 2018-12-02 19:00:40 回复(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

发表于 2018-11-22 09:09:20 回复(0)
#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;
}

发表于 2018-08-30 21:16:53 回复(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();
    }
}

发表于 2018-08-12 17:33:16 回复(0)
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;
    }
}

发表于 2018-04-02 18:56:19 回复(0)
//题目都没有讲清楚最大为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;
}

发表于 2017-11-28 00:10:24 回复(0)
#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;
}

发表于 2017-07-22 15:05:02 回复(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;
}

发表于 2017-05-13 11:07:17 回复(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;
}

发表于 2017-04-20 19:24:37 回复(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;
}

发表于 2017-02-04 10:48:45 回复(0)