PHP按特定key进行多维数组排序
这个排序在网上直接搜索的结果有这样一个:
array_multisort(array_column($array,'sort'),SORT_ASC,$array);
这个是错误的。 切忌不要以讹传讹了。
分析排查
实际上array_multisort 是PHP内置的方法,官方有说明: PHP - array_multisort
这个排序在网上直接搜索的结果有这样一个:
array_multisort(array_column($array,'sort'),SORT_ASC,$array);
这个是错误的。 切忌不要以讹传讹了。
实际上array_multisort 是PHP内置的方法,官方有说明: PHP - array_multisort
题中给出的r、h在最后的答案中无意义
球的体积 V = 4/3 Pi r^3 球的表面积 S = 4 Pi r^2
体积公式推导和论证 : https://www.zhihu.com/question/405287938
#include <iostream>
#include <iomanip>
using namespace std;
const float PI = 3.1415926;
int main(){
float r,h;
cout << "请依次输入半径和圆柱体高度." << endl;
cin >> r >> h;
// cout << setpreise(2) << setfixed;
cout << setiosflags( ios::fixed ) << setiosflags( ios::right ) << setprecission( 2 );
cout << "\n周长:" << 2*PI*r;
cout << "\n面积:" << PI*r*r;
cout << "\n圆球表面积:" << 4 * PI * r * r;
cout << "\n球的体积:" << 4.0 / 3.0 * PI * r * r *r;
cout << "\n圆柱体体积:" << PI*r*r*h;
cout << endl;
return 0;
}
隐约记得之前做过一个c++的题目是判断一个数是否素数(质数) 我当时给的算法是判断 2 - x/2, 因为被除数大于 x/2 那商一定小于2,所以被除数必须大于x/2
最近看书的时候发现通用的算法是计算 2- sqrt(x) 即 根号x 这就让我产生疑问了,毋庸置疑,这个算法的效率更高,时间复杂度是logn。 那为什么到sqrt(x)就够了呢?
我反复思考总算得出了结论,这里用反证法即可:
已知 n 不是素数,且a,b是 n的两个根, a*b = n
假设 b>sqrt(n),且a>=sqrt(n)
则a*b > sqrt(n) * sqrt(n) 即 a*b > n 与条件相悖
得出若存在一个根大于sqrt(n),
那必定存在另一个小于sqrt(n)的根
与此对应的逆否命题是
若不存在小于sqrt(n)的根,则不存在大于sqrt(n)的根
根据这个证明的结论,判断是否是素数,最多只需要判断到 n 的平方根即可。
C和C++语言层面都是不提供输入输出功能的。 C使用scanf和printf这类函数用于输入输出 C++使用iostream库中的 cin、cout来进行输入输出
使用cin 导入 #include <istream>
使用cout 导入 #include <ostream>
都使用 导入 #include <iostream>
cin >> a >> b >> c;
cout << a << b << c << endl;
cout << a+'b' << endl;
#include <iostream>
using namespace std;
int main()
{
char c1,c2,c3,c4,c5;
c1='C', c2='h', c3='i', c4='n', c5='a';
c1+=4, c2+=4, c3+=4, c4+=4, c5+=4;
cout << c1 << c2 << c3 << c4 << c5 << endl;
return 0;
}
这里可以考虑将某个特定数字改写为常量、或变量
在C、C++中有一系列位运算符,在学习位运算符的时候就需要先了解反码、补码的原理。 因为位运算是按照变量在内存中所表示来进行运算的。
而计算机中,数字是按照二进制的补码进行存储的,当然(其他类型以及高级类型本质上也是数字)
二进制的原码,就是将十进制数转换为二进制。
反码:原码符号位不变,其他位按位取反就可以得到了。 补码:反码+1就得到补码。
int a = 251
int b = -232
a的原码:00000000 11111011
a的反码:00000000 11111011
a的补码:00000000 11111011
b的反码:11111111 00010111
b的原码:10000000 11101000
b的补码:11111111 00011000
a+b = 19
使用ab的原码相加 得 10000001 11100011
即 -483
使用ab的反码相加 得 00000000 00010010
即 18
使用ab的补码相加 得 00000000 00010011
即 19
使用补码,如果从比较粗浅的角度来理解,主要是因为负数存在一个 -0,这个 -0 和“正数”中的0 冲突了,在进行加法运算的时候,-0也占了一个位置,这样就会导致,正负数相加结果和我们数学体系中的表示结果差一位,所以负数一律补1,这样就规避掉-0这个陷阱了。
“这个问题理解的时候,我觉得不要讲计算机中的数字理解位数字,实际上计算机里没有所谓的正负,只是存在了2^n中状态,而我们人类数学刚好存在一个0点,这个0点在二进制表示中,其实不应该有位置,但是又必须有,所以就会导致另外一个对称状态很尴尬。”
回到位运算
<<
左移
int a = 5; a<<=1
0000 0101
->0000 1010
a=10
>>
右移
int a = 5; a>>=1;
0000 0101
->0000 0010
a=2
&
与(且)
int a = 5; a&=1;
0000 0101 & 0000 0001
> 0000 0001
a=1
int a = 5; a&=3;
0000 0101 & 0000 0011
> 0000 0001
a=1
|
或
int a = 5; a|=1;
0000 0101 | 0000 0001
> 0000 0101
a=5
int a = 5; a|=3;
0000 0101 | 0000 0011
> 0000 0111
a=7
^
异或 (不同)
int a = 5; a^=1;
0000 0101 ^ 0000 0001
> 0000 0100
a=4
int a = 5; a^=3;
0000 0101 ^ 0000 0011
> 0000 0110
a=6
~
取反 单目运算
int a = 5;
~0000 0101
> 1111 1010
(补码)
对补码进行还原 反码= 1111 1001
,得到原码 = 1000 0110
即
a= -6
C++中的基本数据类型定义没有最终的规定,由编译系统自行确定。
但是一些关系已经确定
一般16位机C++系统中,short int,int 2个字节,long int 4个字节 VC++中,short 2个字节,int,long int 4个字节
一个字节是计算机中的8个bit位
一个比特位就是硬件中的一个逻辑单元 可以表示0 或者1
所以一个字节就是
00000000
一个字节最大值就是
11111111
换算成10进制就是 1+2+4+8+16+32+64+128 = 255
两个字节就是
00000000 00000000
最大值是
11111111 11111111
=> 1+2+... 2^15 = 65535
这里另外需要考虑一个问题就是符号,如果将刚才的范围的第一个比特位用作符号表示的话,那么一个字节的范围就是 1 0000000 - 1 1111111
, 0 0000000 - 0 1111111
即 -128 -> -1
,0 -> 127
这里的负数比正数多一个原因在于 补码机制
Bool实际上需要的是最少的,只需要0,1但是最低的位数也是1字节 char也是1字节 255的范围用于表示基本英文字母和基础符号足够了
loat规格float共计32位,4字节由最高到最低位分别是第31、30、29、……、0位,则:31位是符号位,1表示该数为负,0表示为正。30-23位,一共8位是指数位。22-0位,一共23位是尾数位。3、转换例子按照IEEE浮点数表示法,将float型浮点数123456.0f转换为二进制(注:这里的f表示浮点数,为十进制数,不是表示16十六进制)。处理不带小数的浮点数时,直接将整数部转化为二进制表示:11110001001000000也可以这样表示:11110001001000000.0然后将小数点向左移,一直移到离最高位只有1位:1.11100010010000000共左移了16位,所以原数就等于:1.11100010010000000*(2^16)。
其实简单来说浮点数就是三个部分,位数0、小数点位置(二进制) 1-8 、整体数值二进制表示 9-31
最近回复