20! 用%d算出来是怎样都是负数 用f就是整数 为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20! 用%d算出来是怎样都是负数 用f就是整数 为啥?相关的知识,希望对你有一定的参考价值。

这两种方法都是不对的。

%d不对,是因为它最大只能存储2147483647,比它大的数就“溢出”了;

%f不对,是因为它只能存储7位有效数字,更多位数上的数,就不正确了。而光是20!,就是一个19位数。

#include<stdio.h>

int main()

long long i,j,k=1;

  for(i=1;i<=20;i++)

  k*=i;

   j+=k;

 

  printf("1+2!+3!+...+20!=%lld\\n",j);

  return 0;

追问

long long 是啥?
用double呢
我用的%f显示出来的结果也是一样的?

参考技术A %d是有符号十进制整数,最大值为2147483647。
%f是浮点数,最大值为3.40282e+38。
20!早就超出了%d的表示范围,所以会显示负数。上面的数字具体可使用INT_MAX和FLT_MAX查到。本回答被提问者采纳
参考技术B j是float类型,调用printf函数的时候,传递过去的是float类型的数据8个字节,而你显示的时候是%d显示整形值,会取这8这个字节的其中4个字节,就会出现这种情况。改成%f的时候,就正好数据类型对应,就能正常显示。

如果要用%d来显示,应该把j转位整型值,如下:
printf("1+2!+3!...20!=%d\n",(int)j);追问

很详细了! 就是有一点不明白
j不是随意一个字母吗?
以后随便定义一个名称 字母或数字
怎么知道ijk这种到底属于float还是int?

追答

前面不是定义了:
float i,j=0,k=1;
所以j是float类型

追问

噢这样 如果前面用int呢

追答

那就是int类型

追问

我后来改成了int 结果还是负数(ಥ_ಥ)

追答

因为这个值太大int类型不能表示,所有就是负数

参考技术C 整数溢出了呗。浮点舍弃了精度

leetcode679. 24 Game

题目如下:

解题思路:24点是非常经典的游戏了,因为本题数据量小,可以使用穷举法,把所有的可能结果都算出来。假设nums = [a,b,c,d],记f(n)表示用nums中n个数字进行运算可以得到的结果集,那么f(4)又可以记为f(4) = U(U(f(1),f(3), U(f(2),f(2))) (U表示合集),而f(3)又可以记为f(3) = U(f(1),f(2))。可知f(1)的结果集就是参数本身,f(2)的结果集是两个参数a,b进行四则运算的结果,最后判断24是否在结果集中即可。有一点要注意的是,除法运算会有浮点数产生,所以与24比较的时候要有一个浮动的区间。

代码如下:

class Solution(object):
    def union(self,m,n):
        r = []
        for i in range(len(m)):
            for j in range(len(n)):
                r.append(m[i] + n[j])
                r.append(m[i] - n[j])
                r.append(m[i] * n[j])
                if n[j] != 0:
                    r.append(float(m[i]) / float(n[j]))
                if m[i] != 0:
                    r.append(float(n[j]) / float(m[i]))
        return r

    def calc(self,l):
        if len(l) == 1:
            return l
        elif len(l) == 2:
            r =  [l[0] + l[1],l[0] - l[1],l[0] * l[1],l[1] - l[0]]
            if l[1] != 0:
                r.append(float(l[0])/float(l[1]))
            if l[0] != 0:
                r.append(float(l[1])/float(l[0]))
            return r
        elif len(l) == 3:
            return self.union(self.calc([l[0]]) , self.calc([l[1],l[2]])) + \\
                   self.union(self.calc([l[1]]) , self.calc([l[0],l[2]])) + \\
                   self.union(self.calc([l[2]]) , self.calc([l[0],l[1]]))

    def judgePoint24(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        r = [([nums[0]], [nums[1], nums[2], nums[3]]), ([nums[1]], [nums[0], nums[2], nums[3]]),
             ([nums[2]], [nums[0], nums[1], nums[3]]),
             ([nums[3]], [nums[0], nums[1], nums[2]]), ([nums[0], nums[1]], [nums[2], nums[3]]),
             ([nums[0], nums[2]], [nums[1], nums[3]]), ([nums[0], nums[3]], [nums[1], nums[2]])]

        for m,n in r:
            m = self.calc(m)
            n = self.calc(n)
            result =  self.union(m,n)
            for res in result:
                if abs(float(24) - float(res)) < 0.00000001:
                    return True
        return False

 

以上是关于20! 用%d算出来是怎样都是负数 用f就是整数 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

c程序中基本整型的取值范围:-32768~32767是怎么算出来的?

c语言,求一个数的逆的模n运算等于多少!

一个计算排列组合的程序,算出来结果是负数,咋回事?

c语言中10010100为啥是-20

怎样用Leibniz 定理算圆周率?急!!!!!!!!!!!!!!

怎样用C语言求平均数