C++ 2到n-1不相同的进制数位之和

C++ 2到n-1不相同的进制数位之和

问题任务是计算数字N在进制数从2到N-1时的数位之和。

对于这个问题,我们会得到一个任意正整数N,我们需要将该数字表示为从2到N-1的进制数,并计算每个进制数的数位之和。

在以-n为底的进制数系统中, 每个数字的表示中,从右向左的每个数位表示的是n的0次方到31次方的次数。

例如,当5以-2为底的进制数系统表示时,它表示为101,即2^{2}+2^{0}=5

同时,当5以-3为底的进制数系统表示时,它表示为12,即3^{1}+2*3^{0}=3+2=5

让我们通过以下示例来理解这个问题。

输入

N=6

输出

2 2 3 2

解释 - 给定输入是6。所以,我们需要找到数字N的各位数之和,也就是用不同的基数从2到5表示时的数字6。

当6用二进制表示时,写作110,即\mathrm{2^{2}+2^{1}=6}

6在二进制表示中的各位数之和为2。

6在三进制表示中写作20,即\mathrm{2^{2}*3^{1}=6}。6在三进制中的各位数之和为2。

6在四进制表示中写作12,即\mathrm{4^{1}+2*4^{0}=4+2=6}。6在四进制表示中的各位数之和为1+2=3。

6在五进制表示中写作11,即\mathrm{5^{1}+5^{0}=6}。6在五进制中的各位数之和为2。

因此,我们要求的输出是2 2 3 2。

输入

N=9

输出结果

2  1  3  5  4  3  2

说明 - 由于输入为9,我们需要以2到8的不同基数进制表示9,并找到每个表示法的数字之和。 因此,

9在基数-2中:1001,因此数字之和为2。

9在基数-3中:100,因此数字之和为1。

9在基数-4中:21,因此数字之和为3。

9在基数-5中:14,因此数字之和为5。

9在基数-6中:13,因此数字之和为4。

9在基数-7中:12,因此数字之和为3。

9在基数-8中:11,因此数字之和为2。

因此,我们需要的输出是2 1 3 5 4 3 2。

让我们了解在不同基数进制中打印数字的各位数之和的算法。

算法

由于我们需要找到数字N在2到N-1的每个基数表示法的各位数之和,我们将创建一个函数来找到每个基数表示法下的N的和。

要以任意基数数字表示任意数字N,我们取该数字与右边每位所代表的基数数字的模数,然后将数字除以基数一直到N变为0,以获得该数字在特定基数进制中的表示方法。

例如,我们需要在基数-5的数字体系中表示9。

将9除以5得出余数4,所以最右边的数字为4,然后将N除以5得到1。

现在,将1除以5得出余数1,所以下一个数字是上一个数字左边的数字,结果为1,然后N将变为0。

因此,基数-5数字体系中9的表示方法为14,表示为\mathrm{5^{1}+4*5^{0}=9}

由于我们只需要找到N在不同基数值下表示的各位数之和,我们将简单地将N除以基数值得到余数,并将其添加到N的和中,然后更新N为除以基数值,直到N大于0为止,以获得N在不同基数值下的各位数之和。

我们将使用此算法来计算N在2到N-1的不同基数值下表示时的各位数之和,以解决问题。

方法

实施以上算法的步骤:

  • 我们只需创建一个函数,计算在不同进制下表示的数字N的各位数字之和,进制范围为2到N-1,函数的参数为N和进制数。

  • 我们使用一个while循环,直到N大于0为止。在循环中,我们将N除以进制数得到的余数加到一个变量中,用于存储各位数字之和,并且更新N为N除以进制数。

  • 一旦N变为0,返回存储在变量中的各位数字之和。

  • 使用一个for循环从i=2到i<=N-1,计算数字N在不同进制下的各位数字之和,其中i代表特定的进制数。

  • 通过调用计算数字N在不同进制下各位数字之和的函数,在for循环中,对于每个i从2到N-1的值,打印出不同进制下的各位数字之和。

示例

// C++ program to print the Sum of digits written in different bases from 2 to N-1
#include<bits/stdc++.h>

using namespace std;

//function to give the sum of digits of N when represented in a particular base
int sumOfDigit(int N,int B)
{
    int sum = 0;  //variable to store the sum of digits
    //iterate until N is greater than zero
    while(N > 0)
    {

     int rem=N % B;  //finding the remainder of N when divided by base number 

     sum=sum + rem;  //add remainder with sum  to store the sum of digits

     N=N / B;  //update N by dividing N by base number

    }

    return sum;  //return the sum of digits stored in the variable
}
int main()
{
    int N=10;

    cout<<"Sum of digits written in different bases from 2 to N-1 : " <<endl;

    //using for loop from i=2 to i<=N-1 to find the sum of digits of N when represented in different base number
    for(int i =2; i<=N-1; i++){

        //printing the sum of digits of each different bases by calling the function to calculate the sum of digits of N 
        cout<<sumOfDigit(N,i)<<"  ";

    }
    return 0;
}

输出

Sum of digits written in different bases from 2 to N-1 
2  2  4  2  5  4  3  2

时间复杂度 − O(N*logN),因为计算不同进制下数字位数之和需要log N的时间。

空间复杂度 − O(1),因为我们的方法没有使用额外的空间。

结论

文章讨论了在不同进制下表示的N的数字位数之和的打印概念。我们使用了一种高效的方法来在C++中以(log N)的运行时间和常数的空间复杂度找到N的不同进制下的数字位数之和。

希望您在阅读本文后能理解这个概念和问题的解决方案。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程