ZOJ-1177-K-Magic Number

就是分别以1到9作为开头构造结果,取最小答案。看了参考书之后才做出来,对参考书上的代码进行了一些改进

Accepted1177C++110408
#include "bits/stdc++.h"
using namespace std;
// 参考书上说经在线测试ans的位数最高在15000以内,所以MAXL定为15000
const int MAXL = 15000;
int num[MAXL], ans[MAXL], ansLen;
void saveSmaller(int len) {
    for (int i = len; i > 0; i--) {
        ans[i] = num[i];
    }
    ansLen = len;
}
void build(int k) {
    int carry = 0, pos = 0;
    // 进入循环我们要构造第pos + 1位,当pos + 1 == ansLen的时候num[pos] 一定大于 ans[pos]就算构造成功也会比ans大 
    while (pos < ansLen - 1) {
        carry += num[pos] * k;
        num[++pos] = carry % 10;
        carry /= 10;
        // 当构造成功并且num的长度小于ans的时候说明num < ans,更新ans 
        if (carry == 0 && num[pos] == num[0]) {
            saveSmaller(pos);
            return;
        }
    }
}
int main() {
    int t, n;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        ansLen = MAXL;
        // 一个数开头不能是0,所以从1到9构造结果,并选取最小的作为答案 
        for (int i = 1; i <= 9; i++) {
            num[0] = i;
            build(n);
        }
        for (int i = ansLen; i; i--) {
            printf("%d", ans[i]);
        }
        puts(""); 
        if (t != 0) {
            puts("");
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Angel-Demon/p/10339785.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值