Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当数字包含所有9作为数字时,查找数字长度的函数返回的输出无效_C_Cs50 - Fatal编程技术网

C 当数字包含所有9作为数字时,查找数字长度的函数返回的输出无效

C 当数字包含所有9作为数字时,查找数字长度的函数返回的输出无效,c,cs50,C,Cs50,我有一个函数,返回一个数的长度,方法是将它除以10,直到它小于1且大于0 前 12345=>5 83=>2 问题是9999999999999999s的长度应该是15,但我的函数返回16。该函数适用于其他所有功能 前 123456789123456=>15 C代码 可能是四舍五入错误。第一个不能用float精确表示的整数是2^24,大约1600万,比一行中的15 9小得多 尝试使用双倍,最高可达2^54;从内存中,最好检查ieee 754规范,以验证哪个规范可以表示高达~1e16的INT 或者-计

我有一个函数,返回一个数的长度,方法是将它除以10,直到它小于1且大于0

12345=>5

83=>2

问题是9999999999999999s的长度应该是15,但我的函数返回16。该函数适用于其他所有功能

123456789123456=>15

C代码


可能是四舍五入错误。第一个不能用float精确表示的整数是2^24,大约1600万,比一行中的15 9小得多

尝试使用双倍,最高可达2^54;从内存中,最好检查ieee 754规范,以验证哪个规范可以表示高达~1e16的INT

或者-计算数字的log10,加一,然后截断

Len=floor log10number+1

不必要地将long-long-int转换为float。IEEE-754 32位浮点的尾数是24位。和2^24=16777216,这是可以保证精度表示的最大可能数

这是一种方法:

#include <stdio.h>

int find_num_len(long long int num) {
    return num >= 10 ? 1 + find_num_len(num / 10) : 1;
}

int main(void) {
    printf("%d\n", find_num_len(999999999999999));
    return 0;
}

你的问题是一个有限精度的问题。当你把一个非常接近10次方的数字反复除以10,你会得到一个非常接近整数15.99999的结果…-如此接近以至于计算机无法区分它是稍微小于X还是X本身。在本例中,它被四舍五入到16。步骤1:float num->long long numTry printing num。显然,使用float有问题@MateenUlhaq,我已经试过了。我明白了,第一个怎么不永远持续下去?因为无论什么数字除以10,都会大于0。只是好奇。39/10=3。整数除法向0舍入。当num>0时,使用do{num=num/10;count++;};将允许find_num_len0正确返回1。@chux为什么find_num_len0==1是规范定义?对于二进制字符串,32-clz0==0。我可以更改它,使其行为与stringnum.length等效,正如您所期望的那样,但这使得递归需要一个单独的辅助函数。find_num_len0==1是一个更直观的答案,因为大多数情况下,零被写为0,一位数,而不是零位数。依我看,这符合OP的目标,找到一个数字的长度。IAC,因为OP仅当数字包含所有9作为数字时才有效,所以代码可以自由返回0、1或find_num_len0上的任何内容。你的电话。递归是用int find_num_lenunsigned long int num{return num>=10?1+find_num_lennum/10:1;}处理的,不需要额外的帮助函数。使用FP math来处理整数问题有一个风险:log10number可能返回x.9999的结果。。。。当x+1预计会导致OP的答案不正确时。数字==0或数字<0也会出现问题。当然,这些后面的输入并不都是9。2^24在IEEE 754基本32位二进制算法中精确表示。2^24+1不是。对于64位,2^53+1是第一个未表示的整数。感谢您的提醒-我有点匆忙地将答案插入我的iPhone,我已经有一段时间没有研究浮点格式了。
#include <stdio.h>

int find_num_len(long long int num) {
    return num >= 10 ? 1 + find_num_len(num / 10) : 1;
}

int main(void) {
    printf("%d\n", find_num_len(999999999999999));
    return 0;
}
int find_num_len(long long int num) {
    int count = 1;

    while (num >= 10) {
        num = num / 10;
        count++;
    }

    return count;
}