恭喜你发现了宝藏!本文写了十种方法来解决 [CSP-J2019] 数字游戏!你值得拥有!
先看目录吧。正经的解法适合新手参考,整活方法适合大佬阅读!
目录
我们先来正经的解法。
这些解法都比较基础。可供新手参考。
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;