L1-046 整除光棍 (20 分)567

简介: L1-046 整除光棍 (20 分)567

L1-046 整除光棍 (20 分)


这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。


提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。


输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。


输出格式:


在一行中输出相应的最小的s和n,其间以1个空格分隔。



输入样例:


31


输出样例:


3584229390681 15


不知道怎么处理前导零的情况,然后就这样的错了


4449163f0727499d9b8afe858d96bf95.png


#include<iostream>
using namespace std;
int main()
{
  int n, len = 0, p = 0, now = 1;
  char ans[1000]={};
  cin >> n;
  while (1)
  {
    len++;
    if (p || now)
    {
      ans[p++] = now / n + '0';
    }
    now %= n;
    if (now == 0)
    {
      ans[p] = '\0';
      printf("%s %d", ans, len);
      break;
    }
    now = now * 10 + 1;
  }
  return 0;
}


不用大数除法来做的代码


#include<iostream>
using namespace std;
int main()
{
  string ans;
  int cnt = 1, t = 1, x;
  cin >> x;
  while (t < x){
    t = t * 10 + 1;
    cnt++;
  }
  while (t % x){
    ans += t / x + '0';
    t = t % x * 10 + 1;
    cnt++;
  }
  ans += t / x + '0';
  cout << ans << ' ' << cnt;
  return 0;
}
目录
相关文章
|
6月前
|
算法
容斥原理:能被整除的数
容斥原理:能被整除的数
|
5月前
|
Windows
1091 N-自守数 (15 分)
1091 N-自守数 (15 分)
|
5月前
1056 组合数的和 (15 分)
1056 组合数的和 (15 分)
L1-046 整除光棍 (20 分)
L1-046 整除光棍 (20 分)
127 0
h0118. 最大公约数 (5 分)
h0118. 最大公约数 (5 分)
200 0
L1-037 A除以B (10 分)
L1-037 A除以B (10 分)
133 0
L1-025 正整数A+B (15 分)
L1-025 正整数A+B (15 分)
152 0
L1-036 A乘以B (5 分)
L1-036 A乘以B (5 分)
97 0
L1-022 奇偶分家 (10 分)
L1-022 奇偶分家 (10 分)
84 0