L1-046 整除光棍
最开始想到的是,大数除法
#include <iostream>
const int maxn=1e5+5;
using namespace std;
int c[maxn];//存放商
int cal(int x,int n)
{
int t=0;
for(int i=1;i<=n;i++)
{
c[i]=(t*10+1)/x;//商
t=(t*10+1)%x;//余数借给下一位
}
if(t)//除不尽
return 0;//被除数回去加一位1
int ll=0;
while(c[ll]==0&&ll<n)
ll++;//去除前导0
for(int i=ll;i<=n;i++)
printf("%d",c[i]);
printf(" %d",n);
return 1;
}
int main()
{
int x;
scanf("%d",&x);
//每次增加1的个数
for(int i=1;i<maxn;i++)
{
if(cal(x,i))
break;
}
return 0;
}
其实也还可以再优化一下,其实商可以不存下来的,我们只要边除边输出就可以了
#include <iostream>
const int maxn=1e5+5;
using namespace std;
int main()
{
int x,b=0,n=0;//除数,被除数
//不初始化n就是错的!!要时刻谨记对各变量的初始化!
scanf("%d",&x);
while(b<x)//找到第一个比x大的被除数
{
b=b*10+1;
n++;
}
while(1)
{
printf("%d",b/x);
b%=x;//余数 给下一位用
if(!b)//如果被整除
break;
b=b*10+1;
n++;//1的位数+1
}
printf(" %d\n",n);
return 0;
}