算法提高 三进制数位和

  算法提高 三进制数位和  

时间限制: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值