2022.10.8每日刷题打卡

假期结束开始正常打卡 

​​​​​​​​​​​​​​​​​​​​​Find The Multiple

题目描述:给一个数,输出这个数的倍数且这个数是一个只有0和1组成的数。

首先想到的就是暴力但是没过qwq,题目时间限制1s暴力绝对会TLE,那么怎么去思考呢,想暴力就得优化,怎么优化呢,我们知道我们遍历的数一定是只有0和1构成的那么我们只遍历0和1就好了,那就是从1开始*10或*10+1就可以做到只遍历01数。传统的for不能很好地调控*10或*10+1,所以选择bfs去通过入队进队来遍历,很nice!

#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#define int long long

int bfs(int x){
    std::queue<int> q;
    q.push(1);
    while(!q.empty()){
        int t = q.front();
        q.pop();
        if(t % x == 0){
            return t;
        }
        q.push(t * 10);
        q.push(t * 10 + 1);
    }
    return -1;
}


signed main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);
    int x;
    while(std::cin >> x, x != 0){
        std::cout << bfs(x) << "\n";
    }
    return 0;
}

 

 

更快的做法把打出的表,填到excel表,O(1)就能过。

#include <iostream>
long long a[300] = {0, 1, 10, 111, 100, 10, 1110, 1001, 1000, 111111111, 10, 11, 11100, 1001, 10010, 1110, 10000, 11101, 1111111110, 11001, 100, 10101, 110, 110101, 111000, 100, 10010, 1101111111, 100100, 1101101, 1110, 111011, 100000, 111111, 111010, 10010, 11111111100, 111, 110010, 10101, 1000, 11111, 101010, 1101101, 1100, 1111111110, 1101010, 10011, 1110000, 1100001, 100, 100011, 100100, 100011, 11011111110, 110, 1001000, 11001, 11011010, 11011111, 11100, 100101, 1110110, 1111011111, 1000000, 10010, 1111110, 1101011, 1110100, 10000101, 10010, 10011, 111111111000, 10001, 1110, 11100, 1100100, 1001, 101010, 10010011, 10000, 1111111101, 111110, 101011, 1010100, 111010, 11011010, 11010111, 11000, 11010101, 1111111110, 1001, 11010100, 10000011, 100110, 110010, 11100000, 11100001, 11000010, 111111111111111111, 100, 101, 1000110, 11100001, 1001000, 101010, 1000110, 100010011, 110111111100, 1001010111, 110, 111, 10010000, 1011011, 110010, 1101010, 110110100, 10101111111, 110111110, 100111011, 111000, 11011, 1001010, 10001100111, 11101100, 1000, 11110111110, 11010011, 10000000, 100100001, 10010, 101001, 11111100, 11101111, 11010110, 11011111110, 11101000, 10001, 100001010, 110110101, 100100, 10011, 100110, 1001, 1111111110000, 11011010, 100010, 1100001, 11100, 110111, 11100, 1110001, 11001000, 10111110111, 10010, 1110110, 1010100, 10101101011, 100100110, 100011, 100000, 11101111, 11111111010, 1010111, 1111100, 1111110, 1010110, 11111011, 10101000, 10111101, 111010, 1111011111, 110110100, 1011001101, 110101110, 100100, 110000, 100101111, 110101010, 11010111, 11111111100, 1001111, 10010, 100101, 110101000, 1110, 100000110, 1001011, 1001100, 1010111010111, 110010, 11101111, 111000000, 11001, 111000010, 101010, 110000100, 1101000101, 1111111111111111110, 111000011, 1000};

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	long long n;
	while (std::cin >> n && n != 0) {
		std::cout << a[n] << "\n";
	}
	return 0;
}

​​​​​​​

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值