题目描述
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。
某抽奖活动奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码。
主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
输出
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。
这道题目数的范围为(10000-99999),很小,所以,直接暴力来求就可以了。
方案1,循环这些五位数,将这些五位数转换为字符串,判断字符串内是否含有“4”
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt;
int main(){
for (int i = 10000; i <= 99999; i ++ ){
char s[5];
sprintf(s, "%d", i);//转化为字符串
string str = s;
if (str.find('4') == string::npos)//查找字符串内是否含有4
cnt ++;
}
cout << cnt << endl;
return 0;
}
中间的字符串转换也可以为
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt;
int main(){
for (int i = 10000; i <= 99999; i ++ ){
string s = to_string(i);
if (s.find('4') == string::npos) cnt ++;
}
cout <<cnt << endl;
return 0;
}
方案2:整数取模
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt;
int main(){
for (int i = 10000; i <= 99999; i ++ ){
int t = i;
while (t){
int x = t % 10;
if (x == 4){
cnt ++;
break;
}
t = t / 10;
}
}
cout << 99999 - 10000 + 1 - cnt << endl;
return 0;
}
方案3:排列组合
这是一个五位数,我们来枚举一下每一位
第一位不选4有8种选法
第二位一直到第五位都有9种选法
所以结果为:
8 * 9 * 9 * 9 * 9 = 52488