没有重复的数字和重建int

No repeating digits and reconstructing int

本文关键字:重建 int 数字      更新时间:2023-10-16

我正在设计的程序是为一项作业设计的,但作为一项远程学习,找到解决方案并不容易。我必须创建的程序必须首先向用户请求一个无符号长整型,然后将该数字分解为每个数字,而不重复数字(例如3344,程序应该列出3和4),我的程序只列出所有数字。在它们被列出后,需要将这些数字的位置与位置(右边的数字是位置0)分开。然后程序应该"重建",使原来的无符号长整型

它应该是什么样子的一个例子:

7377683

3:05

6:2

7:34/6

8:1

7377683

我目前使用的代码:

 #include <iostream>
 using namespace std;

 int main()
{
 unsigned long int number;
cout << "Enter an integer " << endl;
cin >> number;                            
for(int i=0; i<10 ; i++)
{
    if (number > 0)
    {
        cout << number%10 << " : " << i;   //output digit and position
        cout << "n";                      
        number /= 10;                     
    }
 }
return 0;
}

我无法使用数组或字符串来完成这项任务,这正是我发现具有挑战性的地方。

您可以将数字位置存储在十进制位掩码类型的东西中。

unsigned long n, digits[10]{};
// Input
std::cin >> n;
// Break down
for (int i = 1; n; i *= 10, n /= 10)
    digits[n % 10] += i;
// Reconstruct and print digit positions
for (int i = 0; i < 10; i++) {
    if (!digits[i])
        continue;
    n += digits[i] * i;
    std::cout << i << ":";
    for (int j = 0; digits[i]; j++, digits[i] /= 10)
        if (digits[i] % 10)
            std::cout << " " << j;
    std::cout << std::endl;
}
// Output
std::cout << n;

这有点整洁,因为你不需要知道你的号码有多少位数。此外,你可以构造新的数字,并在分解它的同一个循环中输出所有数字的位置,从而消除了将数字存储在任何地方的需要,但这感觉像是作弊。

由于不能使用数组或字符串,因此可以将整型类型用作位图。每当您在循环中输出一个数字时,请在位图中设置与该数字对应的位。然后,当你需要输出这个数字时,你会检查这个位是否被设置,如果是,你会跳过打印。可能是以下内容。

for (int mask = 0, i = 0; i<10; i++)
{
    if (number > 0)
    {
        int value = number % 10;
        if ((mask & (1 << value)) == 0)
        {
            cout << value << " : " << i << endl;   //output digit and position
            mask |= 1 << value;
        }
        number /= 10;
    }
}

将数字转换为单个数字的工作原理如下:

int number = 4711;
vector<int> v;
while(number > 0)
{
   int digit = number % 10;
   number /= 10;
   v.push_back(digit);
}

把它重新组合成一个整数(我们需要"向后",因为上面代码中的数字是"从后到前"的)

int number = 0;
for(int i = v.size()-1; i >= 0; i--)
{
    number *= 10;
    number += v[i];
}

我有意不展示一个完整的程序来解决你的问题,因为学习编程的一部分是学习如何解决问题。但有时你需要在路上走几步。

像这样的东西可以用数组来解决问题:

int array[10][10] = { { 0 } };    // Position of each digit. 
int count[10] = { 0 };            // Number of each digit
int number = 4711;
int pos = 0;
while(number > 0)
{
   int digit = number % 10;
   number /= 10;
   count[digit]++;
   array[digit][count[digit]] = pos;
   pos++;
}

我把它留给你来填写剩下的代码(打印并重新组装数字)。[上面的代码无法处理数字zero]。

这是工作解决方案,可解决问题中最关键的问题:

int number = 7377683;
int temp = number;
int pos = 0;
int counter = 0;
int currNum;
int uniqueCount = 0;

添加:用于检查数字中唯一数字数量的代码:

for (int x=0; x<9; x++)
    for (int y=temp; y>0; y/=10)
        if (y%10 == x)
        {
            uniqueCount ++;
            break; 
        }

生成每个独特元素和位置输出的代码:

for (int y=0; y<uniqueCount; y++)
{
    pos = counter;
    currNum = number%10;
    cout << temp%10 << " : ";
    for (int x=temp; x>0; x/=10)
    {
        if (temp%10 == currNum)
            cout << pos << " ";
        pos++;
        temp /= 10;    
    }
    counter++;
    number /=10;
    temp = number;
    cout << endl << endl;
}   

程序输出:

3 : 0 5
8 : 1
6 : 2
7 : 3 4 6

此解决方案使用最基本的构造而不使用数组(根据您的需求)。