[CSP-J 2019]第一题数字游戏 题解 by 对面龙哥

简要分析题目

真的是水题,基本会输入输出会 if else 的都会写,emm……都不知道讲啥了。

那就借此机会讲几个玄学操作吧

常规输入字符串

最常规做法,基本都会:

#include<iostream>
using namespace std;
int ans;
char s[8];
int main() {
    cin >> s;
    for (int i = 0; i < 8; i++) {
        if (s[i] == '1')ans++;
    }
    cout << ans;
    return 0;
}

或者用 string 代替 char 数组:

#include<iostream>
#include<string>
using namespace std;
int ans;
char s[8];
int main() {
    cin >> s;
    for (int i = 0; i < 8; i++) {
        if (s[i] == '1')ans++;
    }
    cout << ans;
    return 0;
}

基础中的基础(连循环都没用的)

因为我们已知字符串长度为8,所以可以手打八个输入,不用循环(可是连循环都不会的人去比赛干嘛?!)

#include<iostream>
using namespace std;
int ans;
char ch;
int main() {
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cin >> ch;
    if (ch == '1')ans++;
    cout << ans;
    return 0;
}

下面开始(负)优化代码

边输入边判断省一点内存

#include<cstdio>
using namespace std;
int ans;
int main(){
    for(int i=0;i<8;i++){
        if(getchar()=='1')ans++;
    }
    printf("%d",ans);
    return 0;
}

直接用 getchar 函数返回值进行判断,省去一个字符的内存,而且 getchar 比 cin 会快上一些。

bitset 存 01 串

bitset 中存储的也是01,可以用它来存01串:

#include<iostream>
#include<bitset>
using namespace std;
bitset<8>s;
int ans;
int main() {
    cin >> s;
    printf("%d", s.count());//count函数统计s中"1"的个数
    return 0;
}

用^代替比较比较运算符

位运算是计算机最基础的运算了,应该比普通的比较快一些(吧):

#include<cstdio>
using namespace std;
int ans;
int main() {
    for (int i = 0; i < 8; i++) {
        if (!(getchar() ^ '1'))ans++;
    }
    printf("%d", ans);
    return 0;
}

面向对象

-用这种方法首先你要有一个对象-

-或者立刻找一个对象-

或者你需要定义一个类(√)

#include<cstdio>
using namespace std;
class ONEZEROCHUAN {
    char ch[8];
    int geshu;
public:
    ONEZEROCHUAN():geshu(0){
        for (int i = 0; i < 8; i++) {
            ch[i] = getchar();
        }
        for (int i = 0; i < 8; i++) {
            if (ch[i] == '1')geshu++;
        }
    }
    void print() {
        printf("%d", geshu);
    }
}ans;
int main() {
    ans.print();
    return 0;
}

代码逐渐抽象ing

面向对象2.0

-此时当我们已经有了对象-

当我们已经熟练掌握了面向对象编程,我们惊讶的发现,-有了对象以后我们已经什么都不需要了-,有了构造函数以后我们已经不需要主函数了:

#include<cstdio>
using namespace std;
class solve {
    int ans;
public:
    solve():ans(0) {
        for (int i = 0; i < 8; i++) {
            if (!(getchar() ^ '1'))ans++;
        }
        printf("%d", ans);
    }
}a;
int main(){}

面向对象3.0

-当我们已经不满足于仅有一个对象,我们就准备去开后宫-

当我们已经不满足于平凡的构造函数,我们想到了析构函数:

#include<cstdio>
using namespace std;
class solve {
    int ans;
public:
    solve() :ans(0) {}
    ~solve() {
        for (int i = 0; i < 8; i++) {
            if (!(getchar() ^ '1'))ans++;
        }
        printf("%d", ans);
    }
}a;
int main(){}

究极代码(仅Windows)

当我们足够强大,最快的时间和最小的内存已经无法让我们感到很勇,我们开始追求刺激(评测机瑟瑟发抖)。

#include<Windows.h>
#include<cstdio>
using namespace std;
int ans;
int main(){
    new int[64225280];
    Sleep(990);
    for(int i=0;i<8;i++){
        if(getchar()=='1')ans++;
    }
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/duimianlongge/p/12115902.html