我正在寻找一种将整数分成数字的有效而简单的方法,但我需要从第一个开始将它们分开。
以下是将数字分成数字的典型方法:
int main(int argc, char* argv[]) { //argc is going to be the number
while(argc != 0) {
cout << argc % 10 << endl;
argc /= 10;
}
return 0;
}
但是这样做,我将获得,例如,5437 - &gt; 7,3,4,5 我想颠倒上诉的顺序,5,4,3,7。所以我创造了这个:
int main(int argc, char* argv[]) {
int rem = 1;
while(argc / rem > 10) //We increase the remainder until we get the same amount of digits than the number
rem *= 10;
while(argc != 0) {
cout << argc / rem << endl; //We take the cocient of the division, wich will be always the first digit
argc %= rem; //Now we discard that digit
rem /= 10; //And we decrease the number of digits of the remainder too
}
return 0;
}
问题是:有没有其他方法可以用更短/更简单的方式来做到这一点?
PS:我不能使用堆栈,列表或那种结构。
提前致谢
答案 0 :(得分:1)
您也可以使用一些字符串方法。例如,您可以将您的数字转换为字符串。因此,您可以使用字符串拆分函数。 当然你可以使用下面的示例代码
#define MaxDigits 8
void SplitDigits(int Number, int* DigitArray)
{
for(int i=(MaxDigits-1); i>=0; i++)
{
DigitArray[i] = Number % 10;
Number /= 10;
}
}
int main()
{
int DigitArray[MaxDigits];
int Number = 1538;
SplitDigits(Number, DigitArray);
for(int i=0; i<MaxDigits; i++)
{
cout << DigitArray[i] << endl;
}
return 0;
}
答案 1 :(得分:0)
解决方案可以是递归:
int index=0, result[100];
void digits(int x) {
if (x > 10) digits(x/10);
result[index++] = x % 10;
}
(但它会使用隐式堆栈)
答案 2 :(得分:0)
unsigned n = 123450;
unsigned m = 0, k = 1;
while (n != 0) {
m = m * 10 + n % 10;
n /= 10;
k++;
}
while (--k > 0) {
cout << m % 10 << endl;
m /= 10;
}
答案 3 :(得分:0)
我想我会将 int 转换为字符串,遍历每个 char 并将其转换回 int < / strong>,同时将新创建的 int 存储在向量中。这可能比它要复杂得多,但我发现它更容易。主要是因为我已经创建了将数字转换为字符串的函数,反之亦然。我确信这不是一种有效的方法,但它确实有效。
以下是我刚刚做过的事情(请注意,这可以在一个函数中完成):
// convert an int to a string representation
string intToString(const int& digit)
{
ostringstream oss;
oss << digit;
return oss.str();
}
// if possible, convert characters in string to integer value
int stringToInt(const string& str)
{
istringstream iss{ str };
int digit;
iss >> digit;
if (!iss)
throw runtime_error{ "integer format error: " + str};
return digit;
}
// split an int into its seperate digits and store them in a vector
vector<int> splitInteger(const int& digit)
{
vector<int> splits; // holds the ints that are split from the original
const string s = intToString(digit);
for (char ch : s) {
const string temp{ ch }; // convert char to string for use with stringToInt()
splits.push_back(stringToInt(temp));
}
return splits;
}
如果你选择这条路线,你可能还想比我更好地命名。我很难快速命名。 :)
所以这是一个使用splitInteger()的简单方法:
int main()
{
cout << "Enter an integer: ";
int num;
cin >> num;
vector<int> splits = splitInteger(num);
for (const int& i : splits)
cout << i << '\n';
system("pause");
return 0;
}