
Lv.1
长存不灭的过去,逐渐消逝的未来
在 问:Python跟C++哪个难 中回复
作为一个兼修Python,C++,H喵L,JavaScript,MySQL的老油条,我个人认为你这样的问题没有任何意义
每一种编程语言都是优秀的,没有任何一种语言学起来比其他语言要简单
有些语言也许入门简单一点,比如Python,但到后面,你会发现他们所联系到的知识体系是极为庞大的,其难度决不低于其他语言
真正可以决定你学什么语言的,是你的发展方向
如果你以后想从事数据分析与挖掘,或者人工智能开发,那么Python绝对是最好的选择,没有之一;
如果你想从事程序底层代码设计,联系api等底层高深代码,C和C++是首选
如果你喜欢企业级应用开发和维护,Java绝对合适
如果你想负责编写大型网站,PHP和Node.js是最近最风靡的语言(当然H喵L, JS,CSS,jQuery也是必修啊)
如果你上面的都想弄,那你直接跳楼算了
(当然这是玩笑)
当然,如果你比较看好Julia,GO这样的新星,也可以研究一下他们的擅长点,没准几年之后它们也能成为某个领域的领军者!
(以上仅个人观点,不喜勿喷,谢谢)
2021-05-31T19:43:25 点赞:2
在 有没有判断一个数是否为整数的办法? 中回复
方法很多的
(1)用isinstance:if isinstance(a, int)
(2)用round:if round(a) == a
(3)如果初始类型是str的话,有两种常见方法:
1.调用str类的isdigital方法
2.try-except结构,在try里面试试int(a),如果没有问题就是整数,否则就是其他乱七八糟的东西
2021-07-04T19:22:12 点赞:0
在 【举报】关于图书馆某文章的原创性问题 中回复
原作链接我这边发不出来啊!会被屏蔽的……
还是建议到喜*拉雅搜索《我的世界之武艺时-代》,听峰叔叔的播讲(免费的)
2021-11-10T08:20:20 点赞:0
在 【请问此C++代码哪里错了】 中回复
这边建议好好再去学学C++(划掉)
代码有如下错误或歧义
1.就算是在struct里面,也不要使用set这样的名称,容易引起歧义
2.在定义的output函数中,你想要输出的是a~z中的字母,而你的set数组是bool类型,因此只能输出b,应改为
if (set[i] == true)
cout << char(i + 'a');
3.在output函数的for循环中,你想实现的效果是输出在同一行,但是你把cout << endl写进了for循环里,应该挪到外面。综上,正确的output函数应该是:
void output(){
for (int i=0; i<26; i++){
if (set[i] == true){
cout << char(i + 'a');
}
}
cout << endl;
}
4.你对于集合间取差集的方式可能有些误解?A - B是由“在集合A中但不在集合B中的元素”组成的集合,因此对减号的重定义应改为:
tSet operator - (const tSet x) const{
tSet 喵p;
for (int i=0; i<26; i++){
喵p.set[i] = set[i] && (!x.set[i]);
}
return 喵p;
}
5.请注意标准缩进应为4个空格(当然也有可能是bcm帖子编辑器的问题)
希望能帮到你。
2022-08-26T20:52:31 点赞:3
在 【请问此C++代码哪里错了】 中回复
给你整体重构了一下代码(直接从帖子复制出来的太丑了),昨天没注意到的是多组数据的时候应该记得把ABC都初始化一下。但是其他地方应该都没啥问题才对(雾
新的代码如下:
#include <iostream>
#include <string>
using namespace std;
struct tSet{
bool set[26];
void input(){
string s;
cin >> s;
for (int i=0; i<s.size(); i++){
set[s[i] - 'a'] = true;
}
}
void output(){
for (int i=0; i<26; i++){
if (set[i] == true){
cout << char(i + 'a');
}
}
cout << endl;
}
tSet operator + (const tSet &x) const {
tSet tmp;
for (int i=0; i<26; i++){
tmp.set[i] = set[i] | x.set[i];
}
return tmp;
}
tSet operator - (const tSet &x) const {
tSet tmp;
for (int i=0; i<26; i++){
tmp.set[i] = set[i] & (!x.set[i]);
}
return tmp;
}
tSet operator * (const tSet &x) const {
tSet tmp;
for (int i=0; i<26; i++){
tmp.set[i] = set[i] & x.set[i];
}
return tmp;
}
};
tSet A,B,C;
char op;
int n;
int main(){
cin >> n;
for (int i=0; i<n; i++){
for (int j=0; j<26; j++) A.set[j] = B.set[j] = C.set[j] = 0;
A.input();
cin >> op;
B.input();
if (op == '+') C = A + B;
if (op == '-') C = A - B;
if (op == '*') C = A * B;
C.output();
}
return 0;
}2022-08-27T23:17:12 点赞:0
在 2022年CSP-J初赛全国通用题目及其民间版本参喵 中回复
实际上CZ在洛谷上给民间答案和题面PDF了( https://www.luogu.com.cn/discuss/495703
2022-09-18T20:06:09 点赞:0
在 【留言征集活动】寻找NCT历届学长学姐 中回复
# 我是NCT满级考生
去年90多(好像是)水过了NCT的Python 4级,2级3级都是15分钟做完开始睡觉,然后满分过,个人感觉题有点过于简单,该考该学的真正有意义的东西不怎么考,考些没用的还只要你死记硬背就能对的深度学习知识,真没看出来有什么意义。
给新生的建议:考试前不用复习,复习会让脑子比较混乱,要好好睡觉吃饭,保证精神状态良好,然后尤其是4级的时候模拟题是必须要刷的,像Kmeans、KNN定义的这种题目一定要去喵记硬背一下概念,记住,死记硬背就行了,真没什么好说的,总之就是以最好的姿态面对考试吧。
最后也祝各位考生前程似锦吧,NCT 4级只是你编程学习的第一步,你要走的路还很长,不忘初心,时常问问自己,我为什么要学习Python?只要志向明确了,就一定能在这个领域有一番出色的作为,期待你们的未来。
2022-12-15T14:21:08 点赞:4
在 【编创协教程】什么是时间复杂度? 中回复
自占qp
原来的那个帖因为原PGAoT网站MarkDown LaTex炸裂导致失去所有观感,因此用pickduck再发一次
2023-02-27T20:14:07 点赞:0
在 为什么我的py文件是个白纸?下载了Python还是个白纸! 中回复
大概率是并没有指定编辑器
而且下载的时候要不然没有把Python添加到PATH环境变量中,要不然没有勾选识别自动用Python编译.py文件
这边建议整个把Python删了重下,重新勾选PATH等选项,另外尽量不要选择用3.8以后的Python版本
2023-06-11T22:45:04 点赞:0
在 【话题讨论】点灯游戏 | 数学好的请进 中回复
来简单说两句,这种题我也只是见过几次,没有太多详尽的了解,下述内容仅供参考。
首先,对于开关灯游戏有三个很显然的结论
1. 每个灯只会被点击0次或1次,一定不会被点击2次及以上
2. 点击灯的顺序不影响结果,也就是点击灯可以用操作集合表示,而不一定是操作序列
3. 将某些特定的灯打开所需要的操作集合和将这些灯还原(重新关上)的操作集合完全相等,即点灯操作符合异或性质
考虑到点灯序列和最终亮灯状态形成映射关系,且一种点灯序列显然仅对应一种亮灯结果,加之两者在n * m的矩阵中均只有2^(喵)种不同状态,因此会有一个比较trivial的结论:如果点灯序列和状态不形成一一对应的映射关系,则一定存在无法通关的初始情况,证明显然。
不过这的确是trivial的,毕竟我们都知道确实存在一些情况下的灭灯游戏无法通关。例子可以自己画画,这里不加赘述。
下面考虑对于初始状态已给出,目标为全白色的数学+信息学解法
考虑将灯的状态用0和1表示,则点击的操作可视为二元域下的加法运算,或单纯的模2意义下加法,又或是异或操作,都可以。
因此可以将初始状态用一个n*m大小的向量表示(当然,要先给格子编号),我们称其为初始状态向量,设为B(begin简写)
每一个格子点击后都会对一些格子造成状态改变,我们通常称其为状态转移。令一个n*m的行向量上每一位对应一个格子的状态是否会因为当前考虑的格子被点击而改变,改变为1,否则为0,这样每个格子都对应一个行向量,这些向量被称为状态转移向量,设为T(transform简写)。
所以我们的任务变成了从所有转移向量中挑选一些,满足B+∑T=0,这里的0表示0向量,即每一位都是0的向量。
由于这一加法运算是在二元域下进行的,一定满足B+B=0(在二元域下,0+0=1+1=0),因此两边同时加上B,即要求满足∑T=B。
但是怎么知道我们要选哪些T呢?这就是方程的作用。对于第i个T,设其为Ti,定义xi为这个Ti选还是不选,由于一开始我们就说过的结论:每个格子至多点击一次,因此xi也只会是0或1,所以我们最终就是求:
x1*T1+x2*T2+···+x(n*m)*T(n*m)=B
这个n*m元1次方程组的解。将n*m个行向量按顺序拼接为(n*m)*(n*m)的状态转移矩阵,最终就是求这个矩阵左乘(x1, x2, x3, ···, x(n*m))这个列向量等于B(也是n*m大小的列向量)的解(这里的解还是求x1到x(n*m),只是换了一种形式)
然后你就会注意到这个东西的形式非常好,可以直接高斯消元,对于n*m比较大的可以LU分解来做,不管怎么说这些就都是计算机的工作了。如果该向量无解,就表示该初始状态下没有可行解。需要注意的是做消元运算的时候也要时刻注意这是在二元域意义下的运算,或者说模2意义下,千万要注意1+1=0这类东西。
这样就解决了对于给定初始状态的n*m矩阵点灯问题,对于给定初始状态且给定终结状态的问题,只需要直接把两者异或一下,就转化为了只给定初始状态,终结状态就是全白的点灯问题,就不多说了。
时间复杂度上Gauss-Moore可能复杂度过高,LU分解比较复杂,建议直接调np.linalg.solve()解决一切问题(bushi,对于其默认按正常运算而不是模意义下运算的问题,可以引入Numpy支持的含GF2的其他库解决,这里就不多说了,毕竟我也没真正搞过二元域这东西。
差不多就这样,希望可以帮到你。
2023-07-28T23:57:48 点赞:3