模拟竖式计算除法

创作来源:在一道比较基础的题卡住了,故做此博客谨记自己。

题目来源:L1-046 整除光棍 - 团体程序设计天梯赛-练习集 (pintia.cn)

题意描述:给定一个整数x,求出这个整数乘以最小的整数s是一个光棍(光棍就是所有位数都由1组成),以及输出光棍的位数。

错误思路:直接暴力穷举关棍,当光棍可以整除x时,就找到这个值。

代码展示:

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
signed main(){
	//IOS;
    int n;
    cin >> n;
    int i=1;
    while(1){
    	while(i<n) i=i*10+1;
    	if(i%n==0){
    		cout << i/n << " "<< (int)log10(i)+1;
    		break;
		} 
    	else i=i*10+1;
	}
	return 0;
}

对于这份代码我也没报多少希望,果然当光棍的值超出long long范围时,则找不到答案,所以这种方法是错的。

正确思路:我们可以模拟竖式相除,当被除数大于除数时,就相除,然后对被除数和除数取模,若取模后不为0(即还没找到s),那么就将他乘以10在加上1(加上1是因为光棍的所有位数都为1),对于位数另开一个计数器统计位数即可。

代码如下:

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
signed main(){
	int n;
	cin >> n;
	int i=1;//模拟光棍的值
	int t=1;//统计位数
	while(i<n){//被除数必须比除数大
		i=i*10+1;
		t++;
	} 
	while(1){
		cout << i/n;//直接输出相除的值
		i=i%n;
		if(i==0) break;//取模为0即找到这个数
		else{
			i=i*10+1;//模拟竖式除法
			t++;
		}
	}
	cout << " " << t;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值