如何在不将数字转换为字符串或字符数组的情况下获取数字的数字?
答案 0 :(得分:42)
以下按重要性递增的顺序打印数字(即单位,然后是数十等):
do {
int digit = n % 10;
putchar('0' + digit);
n /= 10;
} while (n > 0);
答案 1 :(得分:19)
floor(log(number))+1
怎么样?
使用 n 数字并使用base b ,您可以表达任何数字,最多pow(b,n)-1
。因此,要获取基数 b 中数字 x 的位数,可以使用指数的反函数:base-b logarithm。要处理非整数结果,您可以使用floor()+1
技巧。
PS:这适用于整数,而不适用于带小数的数字(在这种情况下,你应该知道你正在使用的类型的精度是多少)。
答案 2 :(得分:13)
因为每个人都在不知道问题的情况下闯入 这是我徒劳的尝试:
#include <iostream>
template<int D> int getDigit(int val) {return getDigit<D-1>(val/10);}
template<> int getDigit<1>(int val) {return val % 10;}
int main()
{
std::cout << getDigit<5>(1234567) << "\n";
}
答案 3 :(得分:11)
我已经看到很多答案,但是他们所有忘记使用do {...} while()
循环,这实际上是解决此问题并正确处理0
的规范方法。
int n = 0;
std::cin>>n;
std::deque<int> digits;
n = abs(n);
do {
digits.push_front( n % 10);
n /= 10;
} while (n>0);
答案 4 :(得分:8)
你想要这样的东西吗?
int n = 0;
std::cin>>n;
std::deque<int> digits;
if(n == 0)
{
digits.push_front(0);
return 0;
}
n = abs(n);
while(n > 0)
{
digits.push_front( n % 10);
n = n /10;
}
return 0;
答案 5 :(得分:6)
这样的事情:
int* GetDigits(int num, int * array, int len) {
for (int i = 0; i < len && num != 0; i++) {
array[i] = num % 10;
num /= 10;
}
}
mod 10将为您提供数字。 div 10s将推进这个数字。
答案 6 :(得分:3)
整数版本很简单:
int fiGetDigit(const int n, const int k)
{//Get K-th Digit from a Number (zero-based index)
switch(k)
{
case 0:return n%10;
case 1:return n/10%10;
case 2:return n/100%10;
case 3:return n/1000%10;
case 4:return n/10000%10;
case 5:return n/100000%10;
case 6:return n/1000000%10;
case 7:return n/10000000%10;
case 8:return n/100000000%10;
case 9:return n/1000000000%10;
}
return 0;
}
答案 7 :(得分:3)
简单递归:
#include <iostream>
// 0-based index pos
int getDigit (const long number, int pos)
{
return (pos == 0) ? number % 10 : getDigit (number/10, --pos);
}
int main (void) {
std::cout << getDigit (1234567, 4) << "\n";
}
答案 8 :(得分:3)
这些解决方案都是递归的或迭代的。可能更直接的方法会更有效率吗?
左到右:
int getDigit(int from, int index)
{
return (from / (int)pow(10, floor(log10(from)) - index)) % 10;
}
从右到左:
int getDigit(int from, int index)
{
return (from / pow(10, index)) % 10;
}
答案 9 :(得分:1)
第一个数字(最不重要)= num%10,第二个数字= floor(num / 10)%10,3rd digit = floor(num / 100)%10。等
答案 10 :(得分:1)
一个简单的解决方案是使用数字的对数10。它返回数字的总位数-1。可以通过将数字转换为整数来固定。
int(log10(number)) + 1
答案 11 :(得分:0)
使用mod 10和div 10操作的序列(无论C ++中的语法如何)来分配 一次一个数字到其他变量。
在伪代码中
lsd = number mod 10
number = number div 10
next lsd = number mod 10
number = number div 10
等...
痛苦! ...但没有字符串或字符数组。
答案 12 :(得分:0)
不像马丁·约克的回答那么酷,但只解决一个任意的问题:
您可以使用递归打印大于零的正整数:
#include <stdio.h>
void print(int x)
{
if (x>0) {
print(x/10);
putchar(x%10 + '0');
}
}
这将在最后打印出最低有效数字。
答案 13 :(得分:0)
多年前,在回答上述问题时,我会写下面的代码:
int i2a_old(int n, char *s)
{
char d,*e=s;//init begin pointer
do{*e++='0'+n%10;}while(n/=10);//extract digits
*e--=0;//set end of str_number
int digits=e-s;//calc number of digits
while(s<e)d=*s,*s++=*e,*e--=d;//reverse digits of the number
return digits;//return number of digits
}
我认为函数printf(...)就是这样的。
现在我要写下这个:
int i2a_new(int n, char *s)
{
int digits=n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
char *e=&s[digits];//init end pointer
*e=0;//set end of str_number
do{*--e='0'+n%10;}while(n/=10);//extract digits
return digits;//return number of digits
}
<强>优点:强>
查找表独立;
C,C ++,Java,JavaScript,PHP兼容;
获取位数min comparisons: 3
;
获取位数max comparisons: 4
;
快速代码;
比较非常简单快捷:cmp reg, immediate_data
- &gt; 1个CPU时钟。
答案 14 :(得分:0)
将所有个别数字转换为数组 - 两种变体:
int i2array_BigEndian(int n, char a[11])
{//storing the most significant digit first
int digits=//obtain the number of digits with 3 or 4 comparisons
n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
a+=digits;//init end pointer
do{*--a=n%10;}while(n/=10);//extract digits
return digits;//return number of digits
}
int i2array_LittleEndian(int n, char a[11])
{//storing the least significant digit first
char *p=&a[0];//init running pointer
do{*p++=n%10;}while(n/=10);//extract digits
return p-a;//return number of digits
}