首页 文章

没有重复的数字和重建int

提问于
浏览
-2

我正在设计的程序是一项任务,但作为远程学习,找到解决方案并不容易 . 我必须创建的程序必须首先向用户询问unsigned long int然后将该数字分解为每个数字而不重复数字(例如3344程序应列出3和4),我的程序只列出所有数字 . 在列出它们之后,该位数的位置需要与位置一起显示(右边的数字是位置0) . 然后程序应该“重建”以使原始的unsigned long int .

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

7377683

3:0 5

6:2

7:3 4 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;
}

我无法使用数组或字符串来完成此任务,这就是我发现的挑战 .

4 回答

  • 0

    这是 working solution ,它解决了您问题中最关键的问题:

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

    Added :用于检查数字中唯一数字位数的代码:

    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;
    }
    

    Program Output:

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

    此解决方案使用最基本的构造 without array (根据您的要求) .

  • 0

    由于您不能使用数组或字符串,因此可以使用整数类型作为位图 . 无论何时在循环中输出数字,都会在位图中设置与该数字对应的位 . 然后,当您需要输出该数字时,检查该位是否已设置,如果是,则跳过将其打印出来 . 可能会有类似下面的内容 .

    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;
        }
    }
    
  • 1

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

    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;
    

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

  • 1

    将数字降为单个数字就像这样:

    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++;
    }
    

    我将它留给你填写剩下的代码(打印并重新组装数字) . [上面的代码不能处理零号] .

相关问题