這寫法省時間但冗長
先判斷n m的位數
假設n=88 m=8888
那麼n_length=2 m_length=4
count=n_length
所以丟到findam的開頭和結尾為(88,100, , ,2)
再來++count;
然後依序為(100,1000, , ,3) (1000,8889, , ,4)
把count丟進去的用意是不用跑一次findam內的for就要判斷它是幾位數的
以下程式碼,若有更快的方法歡迎指教
#include <bits/stdc++.h>
using namespace std;
int fun1(int k)
{
int temp,count=0;
temp=k;
while(temp>0)
{
temp/=10;
++count;
}
return count;
}
int power(int x,int y)
{
int sum=1;
for(int i=0;i<y;++i)
sum*=x;
return sum;
}
void findam(int start,int end,int *store,int &store_count,int count)
{
for(int i=start;i<end;++i)
{
int sum=0,temp=i,a=power(10,count-1);
while(a!=0)
{
sum+=power(temp/a,count);
temp%=a;
a/=10;
}
if(sum==i)
{
store[store_count]=i;
++store_count;
}
}
}
int main()
{
int m,n;
while(cin>>n>>m)
{
int n_length,m_length,count,j=n,store[1000]={0},store_count=0;
n_length=fun1(n);
m_length=fun1(m);
count=n_length;
if(n_length==m_length)
findam(n,m,store,store_count,count);
else
for(int i=0;i<=m_length-n_length;++i)
{
if(i==0)
findam(n,power(10,count),store,store_count,count);
else if(i==m_length-n_length)
findam(power(10,count-1),m+1,store,store_count,count);
else
findam(power(10,count-1),power(10,count),store,store_count,count);
++count;
}
for(int i=0;i<store_count;++i)
{
cout<<store[i];
if(i!=store_count-1)
cout<<" ";
}
if(store_count==0)
cout<<"none";
cout<<endl;
}
return 0;
}