数据范围是做题时需要着重考虑的地方,除了数组的大小需要依此确定之外,数据类型的选用也应当和题目要求吻合。
例如,如果变量的值可能大于等于,就不能使用int
类型而需要转而使用long long
类型,有时甚至需要加上unsigned
修饰以获取非负数范围内更大的范围(针对C/C++
)。
当然,有些人会打算使用浮点数取代整型数来取巧:看上去浮点数的表示范围比整型大多了。但天下没有免费的午餐,在类型大小相同的情况下,浮点类型的精度反而比整型还要低得多。浮点数运算的结果是不准确的(浮点误差),这往往意味着 WA 。
此外,在编写程序时,也应当时刻注意类型间的运算,比如以下语句:
long long ans;
int a = 114514;
int b = 1919810;
ans=a*b;
尽管存储结果的变量使用了64位有符号整数,但是运算数是以32位有符号整型的形式进行运算的,这意味着在赋值之前,乘法运算就已经溢出了。
一种可行的改正方法是,将a,b
都声明为long long
。或者将最后一句写成这样:ans=(long long)a*b
,这种写法强制将a
转化为64位有符号整数,当它与32位有符号整数相乘时,会自动以更高精度的类型进行运算。
此外,即使输入数据和答案都保证在int
范围内,也需要留意中间值超过上界的情况。
如果你使用的是python
等语言,你或许可以稍稍松了口气,因为它是自带大整数的(但是取而代之的你需要考虑程序的时间效率问题)。
我们称一个长度为的整数数组,满足 且为一个长度为的全排列。例如是长度为3的全排列,而,不是全排列。
现在czq想把所有长度为的全排列打印出来,他有台打印机,每台打印机每秒可以打印一个排列。多台打印机可以自由地并行打印,请问最少需要多少秒可以打印完所有的全排列。