算法提高 三进制数位和
时间限制:1.0s 内存限制:256.0MB
问题描述
给定L和R,你需要对于每一个6位三进制数(允许前导零),计算其每一个数位上的数字和,设其在十进制下为S。
一个三进制数被判断为合法,当且仅当S为质数,或者S属于区间[L,R]。
你的任务是给出合法三进制数的个数。
输入格式
一行两个非负整数L,R。
输出格式
一行一个非负整数表示答案。
样例输入
0 0
样例输出
330
数据规模和约定
保证0<=L<R<=12。
#include<stdio.h>
#include<math.h>
//总结:关键在于质数的判断,如果不是质数再去判断是否在区间之内
int prime(int n)
{
int i;
if(n==1||n==0) return 0;
//之前做的都是判断2及2以后的数是不是质数,前面的1和0都会忽略。所以当这次题目考到会多次出现1以及会出现就显得不足了。不过这个“算法”对于4及之上()的数的判断还是可以的
for(i=2;i*i<=n;i++)
//刚进入循环,条件也会对初始值进行判断,所以3根本进不了这个循环
{
if(n%i==0) return 0;
}
return 1;
}
int main()
{
int a[735];
int u,i,o,j,k,l,n=0;
for(u=0;u<3;u++)
for(i=0;i<3;i++)
for(o=0;o<3;o++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
for(l=0;l<3;l++)
{
a[n]=u+i+o+j+k+l;
//一开始看错了,是各个数位上的数的总和,不必考虑按照“权重”展开
n++;
}
int L,R;
scanf("%d%d",&L,&R);
int count=0;
for(i=0;i<729;i++)
{
if(prime(a[i])) count++;
else if(a[i]>=L&&a[i]<=R) count++;
}
printf("%d",count);
return 0;
}