题意:输入一个数x 从小到大输出所有满足 (k*leny+y)*x=y*10+k 的 k*leny+y
思路:因为x 为浮点数 所以等式两边都要乘 1e4
将等式化为 k(leny*x-1)*1e4=y(1e5-x*1e4)
可以通过枚举 len k 来求出y是否存在 存在时位数又是否符合条件
这题坑点略多 还好问了凯神 不然坑死= =
首先 转化 x时要注意浮点误差 x=(int)(lx*10000+0.5);
其次 由于等式两边有可能为0 求出的y也就为0 即该数为个位数时
所以对这种情况进行特判
printf("%d",k);
if(y>0) printf("%d",y);
printf("\n");
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int len(int n)
{
int res=1;
for(int i=1;i<n;i++)
{
res*=10;
}
return res;
}
int digit(long long num)
{
int cnt=0;
while(num)
{
num/=10;
cnt++;
}
return cnt;
}
int main()
{
long long leny,y;
int k;
double lx;
int i,j;
while(scanf("%lf",&lx)!=EOF)
{
int ok=0;
ll x=(int)(lx*10000+0.5);
if(lx>=10)
{
printf("No solution\n");
continue;
}
ll leny=1;
for(i=0;i<=7;i++)
{
for(k=1;k<=9;k++)
{
long long temp=(long long)k*((long long)(leny*x)-1e4);
long long temp1=1e5-x;
if(temp%temp1!=0) continue;
y=temp/temp1;
if(digit(y)==i)
{
if(ok==0) ok=1;
printf("%d",k);
if(y>0) printf("%d",y);
printf("\n");
}
}
leny*=10;
}
if(ok==0) printf("No solution\n");
}
return 0;
}