为考试积累rp好了,看得想吐了,花时间写了一个
N表示求N位的数,可以随便改,但注意check()函数里面的if (num[9]>9) return;是我专门为N=21加的优化,改数字的话注释掉这一行。
运行结果是
128468643043731391252
449177399146038697307
运行时间我没记,大概是在3min之内吧,还可以加一些优化,不过我得继续准备考试去了,考完再说吧
还有按顺序输出也没写,这些再看吧
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define N 21
int power[10][N]={0},num[10]={0},ans[N+1],tmp[10];
void plus(int p)
{
int i;
for (i=0; i<N; i++)
{
ans[i]+=power[p][i];
if (ans[i]>=10)
{
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
}
}
void check()
{
if (num[9]>9) return;
memset(ans,0,sizeof(ans));
memset(tmp,0,sizeof(tmp));
int i,j;
for (i=0; i<10; i++)
for (j=0; j<num[i]; j++) plus(i);
if (ans[N-1]==0) return;
if (ans[N]>0) return;
for (i=0; i<N; i++)
{
tmp[ans[i]]++;
if (tmp[ans[i]]>num[ans[i]]) return;
}
for (i=N-1; i>=0; i--) printf("%d",ans[i]);
printf("\n");
}
void dfs(int dep,int re)
{
if (re==0)
{
check();
return;
}
if (dep==9)
{
num[9]=re;
check();
num[9]=0;
return;
}
int i;
for (i=0; i<=re; i++)
{
num[dep]=i; dfs(dep+1,re-i); num[dep]=0;
}
}
int main()
{
int i,j,k;
for (i=1; i<10; i++)
{
power[i][0]=1;
for (j=0; j<N; j++)
{
for (k=0; k<N; k++) power[i][k]=power[i][k]*i;
for (k=0; k<N; k++)
if (power[i][k]>9)
{
power[i][k+1]+=power[i][k]/10;
power[i][k]%=10;
}
}
}
dfs(0,N);
return 0;
}
[
本帖最后由 czz5242199 于 2011-12-26 06:08 编辑 ]