没有重复的数字和重建int
No repeating digits and reconstructing int
我正在设计的程序是为一项作业设计的,但作为一项远程学习,找到解决方案并不容易。我必须创建的程序必须首先向用户请求一个无符号长整型,然后将该数字分解为每个数字,而不重复数字(例如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
此解决方案使用最基本的构造而不使用数组(根据您的需求)。
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如何在<int>不重建数组的情况下将 vector<vector> 转换为 int**?
- 没有重复的数字和重建int