51nod-1010 只包含因子2 3 5的数

题目传送门

方法一:

/*
	这种方法是通过暴力来解题。
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define MAXN 1000000
#define MAXM 1000000000000000100//注意:这里只填18个0不可以,还要加上100才能通过
//const long long MAXM = 1e18 + 100;
using namespace std;
long long num[MAXN];
int main(void)
{
	int count = 0;
	long long x = MAXM;

	for (long long i = 1; i < MAXM; i *= 2)
		for (long long j = 1; i*j < MAXM; j *= 3)
			for (long long k = 1; i*j*k < MAXM; k *= 5)
				num[count++] = i * j * k;
	//这里是把符合题意并且小于MAXM的数字全部存入数组之中
	sort(num, num + count);
	int T;

	scanf_s("%d", &T);
	while (T--)
	{
		long long n;//注意,这里必须是long long,如果是int不能通过

		scanf_s("%lld", &n);
		if (n == 1)//因为1在数组中能够找到,但是它并不是2 3 5的因数,它应该输出的是它的下一个数2
			printf("2\n");//因此我这里将它特殊化的拿出来等于2
		else
			printf("%lld\n", *lower_bound(num, num + count, n));//用二分搜索来节省时间
	}

	return 0;
}

方法二:

/*
	略有一些技巧
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define MAXN 11000//
using namespace std;
long long num[MAXN];
long long minnum(long long x, long long y, long long z)
{//用来求三个数的最大值
	long long temp = (x > y) ? y : x;
	return (temp > z) ? z : temp;
}
void ugly(void)
{
	long long A = 2, B = 3, C = 5;//这三个数表示的是当前倍数数字的最小值
	int idex2 = 0, idex3 = 0, idex5 = 0;//这三个数字表示用来乘过的次数
	num[0] = 1;//第一个数字为1,因为它乘什么就得什么

	for (int i = 1; i < MAXN; i++)
	{//计算前MAXN个元素,这个数组一直都在乘是增长得很快的
		long long m = minnum(A, B, C);
		num[i] = m;//把三个数字的最小值赋予num[i]以保证它的顺序

		if (A == m)//三个数的最小值是A
			A = 2 * num[++idex2];//那就在数列的下一个值来乘二,增大了A,并且保证了其最小
		if (B == m)
			B = 3 * num[++idex3];
		if (C == m)
			C = 5 * num[++idex5];
	}
}
int main(void)
{
	ugly();
	int T;

	scanf_s("%d", &T);
	while (T--)
	{
		long long n;

		scanf_s("%lld", &n);
		if (n == 1)
			printf("2\n");
		else
			printf("%lld\n", *lower_bound(num, num + MAXN, n));
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在据库的选择上面,选择功能强大的Mysql据库进行据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的据有两项,一项就是账号,另一项据就是密码,当管理员正确填写并提交这二者据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值