这是我第一次发布问题。我希望在一项非常旧的计算机科学作业上得到一些帮助,我从来没有完成过。我不再上课了,只是想看看如何解决这个问题。
读入整数(任何有效的 64 位( 整数 = 长长类型(并输出相同的数字,但插入逗号。
如果用户输入 -1234567890,则程序应输出 -1,234,567,890。通信为 应该出现在每三个有效数字之后(如果剩余更多数字(开始 从小数点开始,向左工作到更有效的数字。如果数字 输入不需要逗号,不要添加任何逗号。例如,如果输入是 234 你 应输出 234。输入 0 应产生输出 0。上例中的注释 该数字可以是正数或负数。您的输出必须保持 输入。
我对编程比较陌生,这是我能想到的:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long n;
cout << "Enter an integer:" << endl;
cin >> n;
int ones = n % 10;
int tens = n / 10 % 10;
int hund = n / 100 % 10;
int thous = n / 1000 % 10;
int tthous = n / 10000 % 10;
cout << tthous << thous << "," << hund << tens << ones << endl;
return 0;
}
原始赋值禁止使用字符串、数组和向量,因此请不要给出涉及这些的建议/解决方案。我知道可能需要某种 for 循环才能在必要的位置正确插入逗号,但我只是不知道如何实现这一点。
提前感谢任何提供帮助的人!
只是为了让你知道如何解决这个问题,我首次提出了一个简单的实现。请记住,这只是一个简单的例子:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long n = -1234567890;
if ( n < 0 )
cout << '-';
n = abs(n);
for (long long i = 1000000000000; i > 0; i /= 1000) {
if ( n / i <= 0 ) continue;
cout << n / i ;
n = n - ( n / i) * i;
if ( n > 0 )
cout << ',';
}
return 0;
}
http://coliru.stacked-crooked.com/a/150f75db89c46e99
简单的解决方案是使用ios::imbue
设置一个可以为您完成所有工作的区域设置:
std::cout.imbue(std::locale(""));
std::cout << n << std::endl;
但是,如果限制不允许string
或vector
,我怀疑这将是一个有效的解决方案。相反,您可以使用递归:
void print(long long n, int counter) {
if (n > 0) {
print(n / 10, ++counter);
if (counter % 3 == 0) {
std::cout << ",";
}
std::cout << n%10;
}
}
void print(long long n) {
if (n < 0) {
std::cout << "-";
n *= -1;
}
print(n, 0);
}
然后主要简单地调用print(n);
一个小的模板类comma_sep
可能是一个解决方案,用法可能很简单:
cout << comma_sep<long long>(7497592752850).sep() << endl;
哪些输出:
7,497,592,752,850
从这里挑选: https://github.com/arloan/libimsux/blob/main/comma_sep.hxx
template <class I = int, int maxdigits = 32>
class comma_sep
char buff[maxdigits + maxdigits / 3 + 2];
char * p;
I i;
char sc;
public:
comma_sep(I i, char c = ',') : p(buff), i(i), sc(c) {
if (i < 0) {
buff[0] = '-';
*++p = ' ';
}
}
const char * sep() {
return _sep(std::abs(i));
}
private:
const char * _sep(I i) {
I r = i % 1000;
I n = i / 1000;
if (n > 0) {
_sep(n);
p += sprintf(p, "%c%03d", sc, (int)r);
*p = ' ';
} else {
p += sprintf(p, "%d", (int)r);
*p = ' ';
}
return buff;
}
};
上面的类只处理整数,浮点数/双精度数需要使用部分专用版本:
template<int maxd>
class comma_sep<double, maxd> {
comma_sep<int64_t, maxd> _cs;
char fs[64];
double f;
public:
const int max_frac = 12;
comma_sep(double d, char c = ',') : _cs((int64_t)d, c) {
double np;
f = std::abs(modf(d, &np));
}
const char * sep(int frac = 3) {
if (frac < 1 || frac > max_frac) {
throw std::invalid_argument("factional part too too long or invalid");
}
auto p = _cs.sep();
strcpy(fs, p);
char fmt[8], tmp[max_frac+3];
sprintf(fmt, "%%.%dlf", frac);
sprintf(tmp, fmt, f);
return strcat(fs, tmp + 1);
}
};
上面的两个类可以通过添加类型特征(如std::is_integral
和/或std::is_floating_point
(来改进。