今天带来的是一道考察模拟、枚举的题,话不多说先看题:
题目:
给定L和R,你需要对于每一个6位三进制数(允许前导零),计算其每一个数位上的数字和,设其在十进制下为S。
一个三进制数被判断为合法,当且仅当S为质数,或者S属于区间[L,R]。
你的任务是给出合法三进制数的个数。
输入格式
一行两个非负整数L,R。
输出格式
一行一个非负整数表示答案。
样例输入
0 0
样例输出
330
数据规模和约定
保证0<=L<R<=12。
思路:
这道题翻译过来就是这个三进制数每一位的和S在所输入的闭区间里或者S是一个素数。
问题理解了开始构建思路:
这是一个给定区间的题目而且数据量很小(最多是3^6-1=728)所以我们完全可以使用暴力枚举来解决问题喜欢的
对于迭代器我们可以模拟3进制的递增,也就是从000000一直加到222222对于三进制我们可以通过定义一个数组来代替这个三进制数字
int a[6] ={0};
//模拟三进制
for(j=5;j>=0;j--)
{
if(a[j]>2)
{
a[j-1]++;
a[j]=0;
}
}
除了这种方法还有一种就是根据十进制数字直接算出每一位数字是多少也就是常用的进制转换时所用除数取余具体代码如下:
for (int i = 0; i <= 728; i++)
{
int t = i;
int s = 0;
while (t)
{
s += t % 3;
t /= 3;
}
}
这种方法减少了一次遍历判断的for循环(毕竟每一点时间都要争取的)所以我采用了第二种算法
完整代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
//素数判断
bool Argue(int n)
{
int i;
if (n < 2)return false;
for (i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
return false;
}
return true;
}
int main()
{
int l, r;
cin >> l >> r;
int num = 0;
for (int i = 0; i <= 728; i++)
{
int t = i; //特别注意这里必须保留i的原值否则会陷入死循环
int s = 0;
while (t)
{
s += t % 3;
t /= 3;
}
if (Argue(s) || (l <= s && s <= r))num++;
}
cout << num << endl;
return 0;
}
好了以上就时这篇博文的全部了,天道酬勤,相信你今天的努力都会在明天取得汇报!!!!