我有一个号码A=7654321
。
我需要位置5的数字(从开头,或结束时的数字3),在这种情况下是3。
是否有一个函数可以执行以下操作:getdigit(A,n)
,其中A是数字,n是我想要的数字的位置?
我可以将数字转换为文本字符串,找到位置n处的数字,然后将其转换回数字(num2str
和str2double
),但这似乎不是一个好的解决方案对我来说,你知道更好的方法吗?
答案 0 :(得分:4)
我能想到的最有效的方法就是做你不想做的事,虽然效率稍高一些!将您的数字转换为字符串,将每个数字分成不同的位置,然后拉出您想要的数字。因此:
function [out] = getDigit(A,n)
C = num2str(A) - 48;
out = C(n);
end
第一句话有点棘手。使用num2str
将您的号码转换为字符数组。现在,您需要了解一下MATLAB内部结构,以了解我接下来要做的事情。通过将字符串转换为double
,它会将每个字符转换为其ASCII表示形式,并将每个字符放入数字数组中的单独条目中,该数组为键盘上存在的每个字符分配唯一的ID 。您会注意到数字零从ID 48开始,并从那里线性增加。因此,我减去48以使数字回到0-9。事实上,如果您只是将字符串减去48,它将自动转换为double
(感谢Luis!)。
一旦我这样做,我会选择我想要的位置,即n
。因此,在执行C = getdigit(7654321, 5);
之后,我们得到:
C =
3
但是,如果你真的不想使用ASCII技巧,你可以使用有关除以10和剩余的权力的信息....实际上,Anders Forsgren将你链接到一个不错的Java帖子,但是让我们在MATLAB中做到这一点。
简单地将A
的模数除以10^n
,将其除以10^(n-1)
并取floor
。但是,有一点需要注意的是,此方法从末尾算起 ,因此您必须使n
等于3。
因此:
function [out] = getDigit(A,n)
out = floor(mod(A, 10^n) / 10^(n-1));
end
执行C = getDigit(7654321, 3)
告诉我们:
C =
3
如果你想坚持你的约定并且从左到右,而不是从右到左,你可以计算出数字中有多少位数,然后简单地使用我上面的逻辑并通过你的值n
并从数字减1减去(从badjr借来)。因此:
function [out] = getDigit(A,n)
n = (floor(log10(A)) + 1) - (n - 1);
out = floor(mod(A, 10^n) / 10^(n-1));
end
重新计算n
的第一部分是确定我们有多少位数代表我们的数字。我们需要采用n
并重新制定它,以便我们指的是从右到左,而不是从左到右的数字位置。这是为了使用我之前定义的逻辑。你需要确保通过减去n - 1
来换行,因为如果你只用n
减去,这实际上是基于提取零索引。如果你想尊重你的函数定义,其中n = 1
是要提取的数字的第一个数字而不是第二个数字,我们必须偏移1。
通过C = getDigit(7654321, 5);
,我们得到:
C =
3
答案 1 :(得分:0)
定义函数getdigit(A, n)
(在文件getdigit.m
中):
function d = getdigit(A, n)
numDigits = floor(log10(abs(A))) + 1;
d = mod(floor(A/10^(numDigits - n)), 10);
end
然后,
>>A=7654321;
>>getdigit(A, 5)
给出
ans =
3