创作来源:在一道比较基础的题卡住了,故做此博客谨记自己。
题目来源: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;
}