第四题
题目
标题:第几个幸运数
到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
我们来看前10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
需要提交的是一个整数,请不要填写任何多余内容。
思路
使用vc数组存储3、5、7的倍数序列,index[0]记录3的倍数,index[1]记录5的倍数,index[2]记录7的倍数,
每次更新3、5\7的倍数,找最小的加入序列中,同时更新index,也就是让倍数++
结果
1905
调试(注意)
调试过程中经常出现 程序运行错误 显示 “process exited with return value 3221225725”
是因为如果全局声明(未初始化)
vector<long long>vc
而不是这样声明:
vector<long long>vc(nmax,0);
vc数组没有正常初始化,况且还不能memset方式初始化,因此在输出vc数组的值时会出现上述问题。
代码
#include <iostream>
#include<vector>
#include<cstring>
using namespace std;
const long long nmax=10000;
vector<long long>vc(nmax,0);
vector<long long>index(3,0);
long long min(long long a,long long b,long long c ){
long long tmp=b>c?c:b;
return a>tmp?tmp:a;
}
void luckynum(){
for(long long cnt=1;cnt<=nmax;cnt++){
vc[0]=1;
long long a=3*vc[index[0]];
long long b=5*vc[index[1]];
long long c=7*vc[index[2]];
long long tmp=min(a,b,c);
if(tmp==a){
index[0]++;
}
if(tmp==b){
index[1]++;
}
if(tmp==c){
index[2]++;
}
vc[cnt]=tmp;
}
/*for(long long i=0;i<vc.size();i++){ //中间测试
printf("%lld ",vc[i]);
}*/
for(long long i=0;i<vc.size();i++){
if(vc[i]== 59084709587505){
printf("%d\n",i);
}
}
}
int main(int argc, char** argv) {
luckynum();
return 0;
}