当前位置:
文档之家› 水仙花数算法研究及其C语言代码实现
水仙花数算法研究及其C语言代码实现
2514
2615
2717
2819
2921
3024
3126
3229
3332
---------
3434
3535
3636
3737
3838
3939
---------
*/
//int count_digit[10]={0}; //count_digit[10]用来得到0-9数字出现的个数
int p[10][N]={0};//p数组用来计算出0-9的N次方。
{
count_mul_power[i][j]=p[1][j]*i[i];
}
*/
count_mul_power[1][j]=p[1][j]*count_digit1;
count_mul_power[2][j]=p[2][j]*count_digit2;
count_mul_power[3][j]=p[3][j]*count_digit3;
对满足条件[*]的一个特定的十元组(k 0 ,k 1 ,...,k 9 )*,即可确定唯一的一个Nar(n).
[定理]
0. MIN(n)<Nar(n)<MAX(n)
1. n>60,Nar(n)不存在.
2.对满足条件[*]的一个特定的十元组(k 0 ,k 1 ,...,k 9 )*,确定唯一的一个Nar(n).
timeinfo->tm_min,
timeinfo->tm_sec);
/*
打印tm,tm_year从1900年计算,所以要加1900,
月tm_mon,从0计算,所以要加1 */
}
/**
对不定方程的一组解进行判断:是否为水仙花数
narcissus_check(count_digit0,count_digit1,count_digit2,count_digit3,count_digit4,count_digit5,count_digit6,count_digit7,count_digit8,count_digit9);
东海陈光剑剑魔书仙读书录
2013.4.28 @ iSoftStone
[参数说明]
N(n):n位十进制正整数N(n)
MAX(n):n位十进制正整数最大值10 n -1
MIN(n):n位十进制正整数最大值10 n-1
Nar(n):n位十进制正整数中的水仙花数
b n-1,b n-2,...,b 1,b 0:N(n)各位十进制数位上的数字,显然b n-1>0.
count_digit7--数字7出现的次数
count_digit8--数字8出现的次数
count_digit9--数字9出现的次数
*/
void narcissus_check(int count_digit0,int count_digit1,int count_digit2,int count_digit3,int count_digit4,int count_digit5,int count_digit6,int count_digit7,int count_digit8,int count_digit9) //检测数字是不是水仙花数
count_mul_power[4][j]=p[4][j]*count_digit4;
count_mul_power[5][j]=p[5][j]*count_digit5;
count_mul_power[6][j]=p[6][j]*count_digit6;
count_mul_power[7][j]=p[7][j]*count_digit7;
case 9:j9++;break;
}
}
/*如果一个数字,和里0-9出现的次数与这个数字里0-9出现的次数相同,那么和就应该是水仙花数(第一位数字不能为0)*/
if((count_digit0==j0)&&(count_digit1==j1)&&(count_digit2==j2)&&(count_digit3==j3)&&(count_digit4==j4)&&(count_digit5==j5)&&(count_digit6==j6)&&(count_digit7==j7)&&(count_digit8==j8)&&(count_digit9==j9)&&(sum_power[0]!=0)) //第一位数字非零!
时间类型(time.h定义)
struct tm --时间结构,time.h定义如下:
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
*/
k 0 *0^n + k 1 *1^n + ...+ k 9 * 9^n =T(n)
2.1判断T(n)是否满足定理[0],if YES ,goto 2.2; else Next S(j+1);
2.2判断T(n)中各位数字上的0,1,2,3,...,9的个数是否恰好等于Sj=(k 0 ,k 1 ,...,k 9 ).
struct tm* timeinfo;
time( &my_time );//获取时间,以秒计,从1970年1月一日起算,存于my_time
timeinfo = localtime( &my_time );//转为当地时间,tm时间结构
//printf ( "\007The current date is: %s", asctime (timeinfo) );
/**
水仙花数算法研究及其C语言代码实现
'BnBn-1...B1'=X(N)= sum{ digit = 0..9, count_digit[digit] * power(digit, N)}
@author东海陈光剑剑魔书仙读书录
水仙花数的相关数学证明及其算法&源程序实现
The Computer Solution Of Narcissistic Number & Mathematical Proofs
3.不定方程k 0 + k 1 +...+ k 9 = n非负整数解十元组Sj的个数为C{10+n-1,10-1}=C{9+n,9}= (9+n)!/[(9!)(n!)]组.
[算法描述]
Step1.求解不定方程k 0 + k 1 +...+ k 9 = n所有的非负整数解S集.
Step2.对每个解Sj计算
int count_mul_power[10][N]={0}; //count_mul_power用来计算数字出现次数乘以它的N次方
//int count=0; //计算得到几个水仙花数了,得到2个以后就结束程序
void init_power() //这个函数用来获得0-9的N次方,存在p数组里
{
int i,j,k;
count_mul_power[i][j] %=10; /// ????
}
for(i=0;i<10;i++) //
for(j=N-1;j>=0;j--)
sum_power[j]+=count_mul_power[i][j]; //求得水仙花数的右边表达式的值sum_power[N]
//此时数组sum_power[N]记录的是1-N位自然数的水仙花右边表达式的值
for(i=N-1;i>0;i--) //剥离数字各个数位(第N位-第1位)上的数字
{
sum_power[i-1]+=sum_power[i]/10; //取第N-1位----第1位上的数字
sum_power[i] %=10; //取得右边表达式算出来的值的:第1到N位上的数字,存储在数组sum_power[N]中
for(i=0;i<10;i++)
p[i][N-1]=i; //矩阵每行全部初始化为(0,1,2,3,4,5,6,7,8,9)
for(k=2;k<10;k++)
{
for(i=1;i<N;i++)
{
for(j=N-1;j>=0;j--)
{
p[k][j]*=k; //计算k=0-9的N次方p[i][N]=i^N
}Байду номын сангаас
int j1=0,j2=0,j3=0,j4=0,j5=0,j6=0,j7=0,j8=0,j9=0,j0=0;
for(i=N-1;i>=0;i--) //对N位数各个数位进行循环:计数统计(即sum(count_count_digit[i]*i^N),i=0-9 )里面每个数字出现的次数
{
switch(sum_power[i]) //
{
int i,j;
int sum_power[N]={0};//对应N位大数X(N)上第1位到第N位上的数字
//把数字0-9出现次数乘以它的N次方,存在count_mul_power[10][N]数组中
//数字i: i^N乘以数字i出现的次数
for(j=0;j<N;j++)
{
/*for(i=1;i<=9;i++)
k 0 ,k 1 ,...,k 9 : N(n)中数字0,1,2,...,9分别总计出现的次数.