【PTA】L1-046 整除光棍(C++)

简介: 【PTA】L1-046 整除光棍(C++)

题目要求:

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由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

代码长度限制         16 KB

时间限制                400 ms

内存限制                64 MB

思路:

       主要功能是寻找一个最小的由多个连续的1组成的数(如11、111、1111等),这个数可以整除给定的整数x。然后输出这个由1组成的数除以x的商,并输出组成这个数的1的个数。

重要变量了解:

       x:输入的不以5结尾的正奇数

       count:光棍的位数

       n:被除数

       n/x:组成商的每一位

模拟除法图示:

       用模拟除法的思路去解决这道题就简单多了,下面我们看图说话

1. 首先需要得到一个比输入的奇数x大的数(全部由1组成),比如:首先比31大的数是111

2. 得到第一位组成商的数字:111/31=3

3. 若是当前被除数不能整除除数,则需要找到下一个被除数,直至能整除就停止寻找

不能整除则留下余数,找下一个被除数:被除数需要增加1个1:比如111%31=18,下一个被除数是1111,则我们需要增加一个1

相当于增加1的效果:余数*10+1,比如18*10+1=181,同时统计一次记录位数的变化

这样即可得到组成商的每一位:余数*10+1/除数,比如181/31=5

头文件和命名空间:

这里包含了<bits/stdc++.h>头文件,它实际上是一个包含了C++标准库中几乎所有头文件的头文件。使用using namespace std;为了避免在代码中重复写std::前缀。

#include <bits/stdc++.h>  
 
using namespace std;

主函数:

程序的入口

int main()
 
{
 
       ....
 
}

定义一个整数x并从标准输入读取它:

int x;  
cin >> x;

初始化n为1(表示当前的由1组成的数,初始时只有一个1),并初始化count为1(表示1的个数):

int n = 1;  
int count = 1;

第一个while循环用于找到第一个可以整除x的由1组成的数:

while(n < x)  
{  
    n = n * 10 + 1; //在n的末尾添加一个1  
    count ++;        //记录1的个数  
}

当找到第一个可以整除x的由1组成的数后,第二个while循环用于输出这个数除以x的商,并更新n和count:

while(1)  
{  
    cout << n / x; //输出n除以x的商  
    n = n % x;     //获取n除以x的余数  
    if(n == 0)  
    {  
        break; //如果余数为0,则退出循环  
    }  
    else  
    {  
        n = n * 10 + 1; //否则,在n的末尾添加一个1,并增加1的个数  
        count ++;  
    }  
}
  1. 打印出n除以x的商。
  2. 计算n除以x的余数,并将这个余数赋值回n。
  3. 检查n是否为0。如果为0,说明n可以被x整除,此时退出循环。
  4. 如果n不为0,则在n的末尾添加一个1(通过将n乘以10再加上1),并增加count的值。

输出组成这个数的1的个数:

cout << " " << count << endl;

程序结束并返回0:

return 0;  
}

例如,如果输入x为3,输出会是37 3,这意味着最小的由多个连续的1组成的数(即111)可以被3整除,商是37,并且这个数由3个1组成。

代码:

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    int x;
    cin >> x;
    int n = 1;
    int count = 1;
    while(n < x)
    {
        n = n * 10 + 1; //寻找可以整除x的111...
        count ++;        //记录1的个数
    }
    while(1)
    {
        cout << n / x;
        n = n % x;
        if(n == 0)
        {
            break;
        }
        else
        {
            n = n * 10 + 1;
            count ++;
        }
    }
    cout << " " << count << endl;
    return 0;
}

测试结果:

目录
相关文章
|
1月前
|
C++
【PTA】L1-016 验证身份(C++)
【PTA】L1-016 验证身份(C++)
53 0
【PTA】L1-016 验证身份(C++)
|
18天前
|
存储 C++
【PTA】L1-039 古风排版(C++)
【PTA】L1-039 古风排版(C++)
9 1
|
1月前
|
Java C++
部落(pta)(并查集) Java以及C++
部落(pta)(并查集) Java以及C++
23 2
|
18天前
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
15 1
|
18天前
|
存储 C++ 索引
【PTA】L1-059 敲笨钟(C++)
【PTA】L1-059 敲笨钟(C++)
11 1
|
18天前
|
存储 人工智能 C++
【PTA】L1-093 猜帽子游戏(C++)
【PTA】L1-093 猜帽子游戏(C++)
15 1
|
18天前
|
存储 C++
【PTA】L1-043 阅览室(C++)
【PTA】L1-043 阅览室(C++)
13 1
|
18天前
|
存储 C++
【PTA】​L1-034 点赞(C++)
【PTA】​L1-034 点赞(C++)
8 0
|
1月前
|
前端开发 JavaScript 测试技术
【PTA】L1-32 Left-pad (C++)
【PTA】L1-32 Left-pad (C++)
24 0
【PTA】L1-32 Left-pad (C++)
|
1月前
|
C++
【PTA】L1-011 A-B (C++)
【PTA】L1-011 A-B (C++)
69 0
【PTA】L1-011 A-B (C++)