PAT初级1087(C++)
题目
思路
注意:x0和x1,x6和x7运算结果相同,且每30(235)为一轮叠加
所以可以先获取30的结果,后续获取有多少个30的轮次,最后获取剩余的数据的个数即可
数量(<=30)
数量(30Num)+数量(N-30Num)
(以上为稍微用了点儿规律的遍历,其他也可利用数据结构完成,例如map,set)
代码
#include <iostream>
using namespace std;
int main()
{
int N,curr=0,currPre=0,re=0;
int i=0,n;
cin>>N;
if(N<30)
{
i=1;
for(;i<=N;)
{
curr = i/2 + i/3 +i/5;
if(curr!=currPre)
{
currPre = curr;
re++;
}
i++;
}
re++;
}
else
{
int num=0;
num = N/30;
i=1;
for(;i<=30;)
{
curr = i/2 + i/3 +i/5;
if(curr!=currPre)
{
currPre = curr;
re++;
}
i++;
}
re = re*num;
i = 30*num + 2 ;
for(;i<=N;)
{
curr = i/2 + i/3 +i/5;
if(curr!=currPre)
{
currPre = curr;
re++;
}
i++;
}
re++;
}
cout<<re<<endl;
return 0;
}
结果
其他解法(搬运)
https://blog.csdn.net/guangjinzheng/article/details/86236787
map的妙用:
https://zhuanlan.zhihu.com/p/139446687