这个专题真的写的我生无可恋,每每在暴走和睡着的边缘徘徊
I’m dying
接week1的一点小提示:关于数学问题
之前有写到一道题是需要让平面直角坐标转化为极坐标
在c++的cmath库当中:
atan2取到的是-pi到pi,但是题目要求取到的是0-2pi
为了简化算法,我们可以采用取模的好办法:
fmod(atan2(y,x), 2 * M_PI)
另外需要注意的是控制输出小数位数的办法:
cout << fixed << setprecision(4) << "(" << poi[j].len << "," << poi[j].ang << ")" << endl;
初始化数组的办法
1.循环遍历
2.memset(a,0,sizeof(a))(亲测对二维数组十分有效)
注意:在c++中记得一定要调用ctsring库
(或者使用结构体能够节约很多时间)
关于题目的变态要求:要求你输出的每一行结尾没有空格
为了通过我们的样例:最好的办法是先输出每一行第一个输出,然后再循环<< ’ ’ << XX ;亲测有效
2893 关于位数
1.此题目涉及到对于中文的处理:
不管是用string还是用char数组处理的中文,中文占两个字节,在内部编译为乱码,甚至可能出现为补码的表现(无法计算位数了)
所以要强转一下:unsigned char a = str[i]
char类型储存的话则会截断(因为char类型只有一个字节)
2.对于数的处理:
按位与运算:按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只要对应的二个二进位都为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:3&10可写算式如下: 00000011&00001010 00000010 十进制2
<<左移运算符>>右移运算符
字符通过与1‘&’(结果只会是1或者0),然后再用左移/右移运算符移位,可以借此计算这个数1或者0的个数
或者
for(i = 0; i < len; ++i)
{
int x = 1;
for(j = 0; j < 8; ++j)
{
if(s[i] & x) cnt++;
x = x << 1;
}
}
gcd的简化算法
int gcd(int a, int b)
{
return(b==0)?a:gcd(b,a%b);
}
3053神秘信息
1.计算非重复字符的个数,个数代表几进制,每一个非重复字符代表了此进制下的一个数,从而转换为数值
2.要注意:因为这道题,数据很大所以用了long long型输出,但是使用c++中自带的cmath库会遇上精度问题(我自己的解决办法是自己写了一pow解决,讨论区有人说pow+0.5能解决问题,我试过没有成功,可能和我的算法有关?)
long long pow(long long a, long long b)
{
long long temp = a;
if(b == 0) return 1;
for(int i = 1; i < b; i++)
a *= temp;
return a;
}
注意⚠️:要用一个temp来储存a,否则a的值会一直改变
优化以后的算法:
long long num = 0, a = 0;
long long cha[NUM + 1];
memset(cha, -1, sizeof(cha));
cha[str[a]] = 1;
while(str[++a])
if(cha[str[a]] == -1)
{
cha[str[a]] = num;
num = num ? num + 1 : 2;
}
if (num < 2) num = 2; a = 0;
while(str[a]) cnt = (cnt * num + cha[str[a++]]);
大整数的进制转换(吐血)
照着模板抄吧,我也没办法,智商不太够理解不了
string str;
int num = 0,bin[NUM], m, n;//m待转换进制,n为转换后进制
for(int i = 0; i < str.length();)
{
int k = 0;
for(int j = i; j < str.length();j++)
{
int temp = (str[j] - '0' + k * m) % 2;
str[j] = (str[j] - '0' + k * m) / 2 + '0';
k = temp;
}
bin[num++] = k;
while(str[i] == '0') i++;
}
2822
这也没办法,模版上吧:
atoi和atof只对字符数组有用,string类型不可以
所以又需要调用strchr来比较寻找"."(还只能用双引号)
要输出%02x的类型仍然是printf比较适合
非常C的风格
进制转换
while(x)
{
op_rev[cnt++] = x % y;
x /= y;
}
还是while(x)比较好,while(x%y)容易在x和y相等的时候自己暴死
#3040
memset 不能把数组初始化为0或者-1之外的值!