題意:輸入一個數x 從小到大輸出全部知足 (k*leny+y)*x=y*10+k 的 k*leny+yios
思路:由於x 爲浮點數 因此等式兩邊都要乘 1e4git
將等式化爲 k(leny*x-1)*1e4=y(1e5-x*1e4)spa
能夠經過枚舉 len k 來求出y是否存在 存在時位數又是否符合條件blog
這題坑點略多 還好問了凱神 否則坑死= =string
首先 轉化 x時要注意浮點偏差 x=(int)(lx*10000+0.5);it
其次 因爲等式兩邊有可能爲0 求出的y也就爲0 即該數爲個位數時io
因此對這種狀況進行特判 class
printf("%d",k);
if(y>0) printf("%d",y);
printf("\n");stream
#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; }