[CSP-J2019] 数字游戏题解(正经与不正经的都有,十种方法)

恭喜你发现了宝藏!本文写了十种方法来解决 [CSP-J2019] 数字游戏!你值得拥有!

先看目录吧。正经的解法适合新手参考,整活方法适合大佬阅读!

目录

 我们先来正经的解法

1、字符串扫描法

2、位运算“与”方法

3、 万物皆可打表法

4、bitset容器法

5、取余法

6、cin.get 法

不正经的解法

7、线段树法

8、树状数组法

9、Kruskal最小生成树法

10、(压轴)FFT快速傅里叶变换法

update 

粉福


 我们先来正经的解法。

这些解法都比较基础。可供新手参考。

1、字符串扫描法:

我们把读入的内容当作字符串。之后进行判断:如果是 ‘1’ 就计数器加一。本方法也可以分为两种方法,一种用 char 还有一个自然使用 string.

char 类型方法如下:

#include<bits/stdc++.h>
using namespace std;
int ans=0;
char s[10];
int main(){
	cin>>s;
	for(int i=0;i<8;i++){//模拟
		if(s[i]=='1'){//判断是否为1
			ans++;//计数器++
		}
	}
	cout<<ans;
	return 0;
}

string 类型方法如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s1;
	int cnt;
	cin>>s1;
	for(int i=0;i<s1.length();i++){ //这里可以换为:for(int i=0;i<8;i++)
		if(s1[i]=='1')cnt++;
	}
	cout<<cnt;
	return 0;
}

2、位运算“与”方法:

输入的内容我们可以通过ASCII码来转换为 int 类型。代码可以这么写:

int x=s1[i]-'0';

那么转为整数能干嘛?我们可以使用与运算。位运算 & 符号的含义是:如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。不过这种方法确实多此一举。

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1;
    cin>>s1;
    int cnt=0;
    for(int i=0;i<s1.length();i++){//等同于:for(int i=0;i<8;i++)
        int x=s1[i]-'0';//运用ascii码转换为整形。等同于:int x=s1[i]-48;
        if(x&1)cnt++;//1的二进制位是1.所以这句话等同于:if(x==1)cnt++;
    }
    cout<<cnt<<endl;
    return 0;
}

3、 万物皆可打表法:

内存限制250MB,空间足够!最大值为11111111,小于60000000。打表干嘛,愣着啊!

#include <bits/stdc++.h>
using namespace std;
int a[11111115];
int main(){
	int n;
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值