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)。

输出格式:

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

输入样例:

31

输出样例:

3584229390681 15

 分析:

利用竖除法来 进行大数除法  个人感觉 最关键在于找到 最小的 被除数  比如这道题就是 如果输入为 31 那么 最小被除数就是111

不管是1111 除31 还是   11111 除31 以及 111111111111111 除31  运算的时候都是先计算 111除31  这个用手算一下 然后观察一下就可以看出来了

这里我简单写了下 有点丑 还是上面的例子 可以发现 运算的时候 都是先于111 进行除法然后得到18 然后补1 然后再除再补1一直到余数为0

代码和 其他大佬的一样:

#include<iostream>
using namespace std;
int main()
{
    //除数
	int c;
	cin >>c;
	int bc=0;
	int cunt=0;
	while(bc<c)
    {
        bc=bc*10+1;
        cunt++;
    }
    while(true)
    {
        //每次除法 都可以得到商的其中一位
        cout<<bc/c;
        //bc 就是 被除数 准确来说是被除数的余数 
        bc=bc%c;
        if(!bc)
        {
            break;
        }else
        {
            bc=bc*10+1;
            cunt++;
        }
    }
    cout <<" "<<cunt;



	return 0;
}

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值