我试图获取一个数字在c中的小数位数:0.0001-> 4个小数,3,54235-> 5个小数,依此类推(如果不知道,则是逗号后面的数字数。)我们的老师说这可以通过两种方式完成:使用字符串和不使用字符串。我认为我不会使用字符串,因为我对字符串没有经验。
这就是我想出的
int funzione1(float decimals){
int x=1,c=0,y=1;
while (x!=0){
if((decimals - y) > 0){
y = y / 10;
c++;
}else{
decimals = decimals - y;
}
if(decimals == 0)
x=0;
}
return c-1;
}
调用该函数时,它应该返回我计算出的小数位数,但实际上并不会陷入无限循环。
该代码背后的想法是将数字“字符串”中的每个数字都设为0,然后检查总数是否为0
3.456 c = 0
0.456 c = 1
0.056 c = 2
0.006分= 3
0.000返回c
但这给我留下了两个问题:1如何在逗号前确定数字的位数,例如5564.34234,此代码将不起作用,因为在整数为实数0之前它将计数为8。因此无法返回正确的小数位数.2。我设计的代码无法正常工作。只是陷入无限循环。我不知道在哪里创建循环的无限性。
我如何使此代码起作用?
PS。我在Java中找到有关此问题的文章:如何找出一个数字有多少个小数?但它使用的是字符串,我不喜欢这样做,因为我不知道如何使用字符串。
编辑:这是我尝试的另一段代码,当您输入大于1的数字时输给50的输出失败,如果输入的数字小于0则失败(我不明白,一点点)无论如何,这里是代码:
int funzione1(float decimals){
int i=0;
while(decimals!=((int)decimals)){
i++;
decimals=decimals*10;
}
return i;
}
如果您不关心舍入,则无需计算小数位数,您只需计算二进制位数。这是因为10一次恰好包含2作为因数,因此10 ^ n和2 ^ n具有与因数相同的2s。计算二进制位数的最快方法是获取浮点数的指数。
例如,二进制0.001占据3个小数位代表0.125,0.0001占据4个0.0625。
您可以获取值的小数部分,然后乘以2并按照人们建议的10除去整数(它将得到相同的答案)。
或者,您可以通过优化解决方案获得更多乐趣(places函数完成大部分工作):
#include <math.h>
int saturateLeft (unsigned int n) {
n |= (n << 1);
n |= (n << 2);
n |= (n << 4);
n |= (n << 8);
n |= (n << 16);
return n;
}
int NumberOfSetBits(int i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
int places (double num) {
int exponent;
float mantissa = frexp (num, &exponent);
/* The answer we are looking for is given by the
(number of bits used by mantissa) - the exponent.
*/
unsigned intMantissa = scalbnf (mantissa, 32);
/* Could also be got by doing:
intMantissa = *(unsigned *)&mantissa << 9;
*/
/* To work out how many bits the mantissa covered we
need no gaps in the mantissa, this removes any gaps.
*/
intMantissa = saturateLeft (intMantissa);
int bitCount = NumberOfSetBits (intMantissa);
/* bitCount could also be found like this:
intMantissa = ~intMantissa;
int bitCount = 32 - ilogb (intMantissa) - 1;
*/
int result = bitCount - exponent;
if (result < 0)
return 0;
return result;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句