获取一个数字在c中的小数量?
我试图得到一个数字在c中的小数量:0.0001->4个小数,354235->5个小数,等等(如果你不知道,逗号后面的数字)。我们的老师说有两种方法可以做到,使用字符串和不使用字符串。我想我不会使用字符串,因为我对字符串没有经验 这就是我想到的获取一个数字在c中的小数量?,c,C,我试图得到一个数字在c中的小数量:0.0001->4个小数,354235->5个小数,等等(如果你不知道,逗号后面的数字)。我们的老师说有两种方法可以做到,使用字符串和不使用字符串。我想我不会使用字符串,因为我对字符串没有经验 这就是我想到的 int funzione1(float decimals){ int x=1,c=0,y=1; while (x!=0){ if((decimals - y) > 0){ y = y / 10;
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 c=3
0.000返回c
但这给我留下了两个问题1如何确定逗号前的数字量,比如5564.34234。这段代码不起作用,因为它将在整数为实数0之前计数到8。因此不能返回正确的小数位数。我设计的代码不起作用。只是陷入了一个无限循环。我不知道循环的无限性是在哪里产生的
如何使此代码正常工作
另外,我在Java中找到了这篇关于这个问题的文章:但是它使用字符串,我不喜欢这样,因为我不知道如何使用字符串
编辑:这是我尝试的另一段代码,它失败了,当你输入一个大于1的数字时,输出50,如果数字小于0(我不明白,一点也不明白),无论如何,这是代码:
int funzione1(float decimals){
int i=0;
while(decimals!=((int)decimals)){
i++;
decimals=decimals*10;
}
return i;
}
这里有一个想法:
- 从一个浮点数开始,比如a=3.0141589
- 通过减去整数部分,使小数点0之前的部分保留0.0141589
- 在循环中,将
乘以10并保存整数部分,这将为您提供一个从0到9的数字列表a
- 从该列表中,导出小数位数
- 从一个浮点数开始,比如a=3.0141589
- 通过减去整数部分,使小数点0之前的部分保留0.0141589
- 在循环中,将
乘以10并保存整数部分,这将为您提供一个从0到9的数字列表a
- 从该列表中,导出小数位数
这个算法中有一些有趣的细节需要你去发现,我不会破坏等待你的乐趣或惊喜。你最好的选择是将输入读取为字符串,然后只计算“.”之后的数字。浮点数不是精确的表示形式,即十进制值在内部以二进制形式存储,可能无法精确表示真正的十进制值。然而,每一个二进制表示都是有限位数的十进制数
看看SO中的答案。您最好将输入读取为字符串,然后只计算“.”后面的数字。浮点数不是精确的表示形式,即十进制值在内部以二进制形式存储,可能无法精确表示真正的十进制值。然而,每一个二进制表示都是有限位数的十进制数
看看SO中的答案。如果你不关心四舍五入,那么你不需要计算小数位数,你只需要计算二进制位数即可。这是因为10包含2作为一个因子,因此10^n和2^n具有与因子相同的2个数。计算二进制位数的最快方法是获取浮点数的指数 e、 g.二进制0.001取3位小数代表0.125,0.0001取4位小数代表0.0625 你可以得到这个值的小数部分,然后继续乘以2,然后删除整数,就像人们建议的那样,用10(它会给你相同的答案) 或者,您可以在优化解决方案时获得更多乐趣(places功能完成了大部分工作):
#包括
int-saturateLeft(无符号int-n){
n |=(n>4)&0x0f0f)*0x01010101)>>24;
}
整数位数(双位数){
整数指数;
浮点尾数=frexp(数值和指数);
/*我们正在寻找的答案由
(尾数使用的位数)-指数。
*/
无符号尾数=scalbnf(尾数,32);
/*也可以通过以下方式获得:
整数尾数=*(无符号*)&尾数如果你不关心四舍五入,那么你就不需要计算小数位数,你只需要计算二进制位数。这是因为10包含2作为因子,因此10^n和2^n具有与因子相同的2位数。计算二进制位数的最快方法是获得flo的指数点号
e、 g.二进制0.001取3位小数代表0.125,0.0001取4位小数代表0.0625
你可以得到这个值的小数部分,然后继续乘以2,然后删除整数,就像人们建议的那样,用10(它会给你相同的答案)
或者,您可以在优化解决方案时获得更多乐趣(places功能完成了大部分工作):
#包括
int-saturateLeft(无符号int-n){
n |=(n>4)&0x0f0f)*0x01010101)>>24;
}
整数位数(双位数){
整数指数;
浮点尾数=frexp(数值和指数);
/*我们正在寻找的答案由
(尾数使用的位数)-指数。
*/
无符号尾数=scalbnf(尾数,32);
/*也可以通过以下方式获得:
intMantissa=*(unsigned*)&尾数考虑我的基于字符串的解决方案:
#包括
#包括
#包括
#包括
#包括
整数个小数(双x)
{
int-cnt;
char*ptr;
char str[20]={0};
//以分数pa为例
#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;
}