标签:
题意:输入一个数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; }
标签:
原文地址:http://www.cnblogs.com/sola1994/p/4393453.html