digits 2

digits 2

题目描述

You are given a positive integer n which is at most 100.

Please find a positive integer satisfying the following conditions:

The sum of all digits of this number is dividable by n.

This number is also dividable by n.

This number contains no more than 10410^4104 digits.

If such an integer doesn’t exist, output “Impossible” (without quotation marks).
If there are multiple such integers, please output any one.

输入描述:

The first line contains one integer T indicating that there are T tests.

Each test consists an integer n in a single line.

1≤T≤1001 \le T \le 1001≤T≤100

1≤n≤1001 \le n \le 1001≤n≤100

输出描述:

For each query, output one line containing the answer. The number you print cannot have leading zeros. If there are multiple answers, you can print any. If such an integer doesn’t exist, output “Impossible” (without quotation marks) in a single line.

示例1
输入

3
1
9
12

输出

1
666666
888

说明

For the last test, 888 is dividable by 12 (888 = 12 * 74) and 8 + 8 + 8 = 24 is also dividable by 12 (24 = 12 * 2).

简单翻译一下题目:给出一个正整数n,找出一个整数满足如下条件:
1.这个数字各位之和可以被n整除
2.这个数字本身可以被n整除
3.这个数字的位数不能超过10的四次方

首先,由于题目说只要求出满足要求的任意一个整数即可,所以对输出的数字没有过多要求。假设给定一个整数n,要想满足上面三个条件,可以把n看成一个字符串,显然,所有由n组成的字符串都可以被n整除,比如:n = 99,那么9999(也就是2个n组成的字符串)肯定可以被n整除那么这个条件就解决了。那么如何让数字各位之和可以被n整除呢?同样,这里我还是假设n = 99 ,用 m 来表示n的各位数字之和,这里 m = 18,定义一个k来表示这个字符串是由k个n组成的,所以很明显,要想满足要求1,就要让 km可以被n整除 即 k*m % n == 0,这样最主要的2个问题就解决了.第三个要求是用来判断是否存在这样的整数满足1,2两个条件,所以用一层for循环遍历从0-10000的所有数字,看是否存在一个满足 k*m % m == 0 的数字,将k的初值赋为0,如果找到这样的一个满足条件的值,就将他的值赋给k,直接跳出循环然后输出k个n,如果k的值到执行完整个for循环还没有改变,那就说明,不存在这样的数字,输出Impossible,然后continue即可。除此之外还需要保证整个字符串的总位数要小于10000,所以在下面加以判断即可,这里不多赘述。

代码:

#include <bits/stdc++.h>
 
using namespace std;
 
const int inf = 10000;
 
int getsum(int n)   //用来计算数字n的各位之和
{
    int sum = 0;
    while(n)
    {
        sum += n %10;
        n /= 10;
    }
    return sum;
}
 
int getdig(int n)   //用来计算数字n的位数
{
    int cnt = 0;
    while(n)
    {
        cnt++;
        n /= 10;
    }
    return cnt;
}
 
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        int m = getsum(n);
        int k = 0;
        for(int i = 2 ; i < inf ; i += 2)
        {
            if(i*m % n == 0)    //判断是否有满足情况的i,若有就将i的值赋给k,然后跳出循环
            {
                k = i;
                break;
            }
        }
        if(k == 0)
        {
            cout << "Impossible\n";
            continue;   //回到下一组数据
        }
        int z = getdig(n);
        if(z*k <= inf)
        {
            for(int i = 0 ; i < k ; i++)
                cout << n;
            cout << "\n";
        }
        else
            cout << "Impossible\n";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值