没有重复的数字和重建int

时间:2014-04-12 23:46:25

标签: c++

我正在设计的程序用于作业,但作为远程学习,找到解决方案并不容易。 我必须创建的程序必须首先向用户询问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 :(得分:1)

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

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 :(得分: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;

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

答案 2 :(得分:0)

将数字缩小为单个数字就像这样:

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

将它重新组合成一个整数(我们需要去#34;向后&#34;,因为数字出来&#34;回到前面&#34;在上面的代码中)

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

我故意没有展示完整的程序来解决您的问题,因为学习编程的一部分是学习如何解决问题。但是你有时需要一些步骤&#34;在途中。

这样的东西会用数组来解决它:

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

我要留下给你填写剩下的代码(打印并重新组装号码)。 [上面的代码没有处理数字零]。

答案 3 :(得分:0)

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

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

此解决方案使用最基本的构造不带阵列(根据您的要求)。