c语言 用两种算法求解所有的水仙花数

Python017

c语言 用两种算法求解所有的水仙花数,第1张

#include<stdio.h>

#include<math.h>

#include <stdlib.h> 

#include<time.h>

#include<windows.h>

int main(void)

{

    double n,k,t1,t2,t3,ge,shi,bai,qian,wan,shiwan,baiwan,qianwan,yi,shiyi

    int i,m,aFILE *pp=fopen("123.txt","a")t1=t2=t3=0 int y,b,c,j

    clock_t start,finish,zhishi,zhizhong,kkk,mmm

    k=t1=t2=ge=shi=bai=qian=wan=0a=i=0n=3

    m=9

    printf("水仙花是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。\n")

    printf("例如:153=1^3+5^3+3^3。而本程序将探索9位以内的水仙花数\n") 

    printf("本次运算将会保存结果为123.txt到本程序根目录下\n")

    system("pause")

    kkk=clock()

    onceagain:

        i=10a++

    printf("第%d回合开始:\n",a) 

    printf("本次计算%.0lf位的水仙花数\n",n)

    fprintf(p,"\n%.0lf位水仙花数:",n)

    zhishi=clock()

    for()

    {

        i++

        if(i==11){start=clock()}

        if(n==3&&i==11) {i=100} 

        if(n==4&&i==11) {i=1000}

        if(n==5&&i==11) {i=10000}

        if(n==6&&i==11) {i=100000} 

        if(n==7&&i==11) {i=1000000}

        if(n==8&&i==11) {i=10000000}

        if(n==9&&i==11) {i=100000000}

        y=ik=0

        do {

            c=y%10

            y=y/10

            j=1

            b=c

            while(j<n)

                {

                b=b*c

                j++

                }

            k=k+b

            }while(y>0)

        /*ge=     i/         1% 10

        shi=    i/        10% 10

        bai=    i/       100% 10

        qian=   i/      1000% 10

        wan=    i/     10000% 10

        shiwan= i/    100000% 10

        baiwan= i/   1000000% 10

        qianwan=i/  10000000% 10

        yi=     i/ 100000000% 10

        shiyi=  i/1000000000% 10*/

        /*k=pow(ge,n)+pow(shi,n)+pow(bai,n)+pow(qian,n)+pow(wan,n)

        k=pow(shiwan,n)+pow(baiwan,n)+pow(qianwan,n)+pow(yi,n)+pow(shiyi,n)+k*/

        /*如上被注释成伪代码的部分是第一代代码,效率低*/

        if(k==i){finish=clock()t1=(double)(finish-start)/CLOCKS_PER_SECstart=clock()}

        if(k==i){printf("%.0lf 算出该答案耗时:%.3lf秒\n",k,t1)}

        if(k==i){fprintf(p,"\n%.0lf 算出该答案耗时:%.3lf秒",k,t1)}

        if(n==3 &&i>999){break}

        if(n==4 &&i>9999){break}

        if(n==5 &&i>99999){break}

        if(n==6 &&i>999999){break}

        if(n==7 &&i>9999999){break}

        if(n==8 &&i>99999999){break}

        if(n==9 &&i>999999999){break}

    }

    zhizhong=clock()t2=(double)(zhizhong-zhishi)/CLOCKS_PER_SEC

    printf("第%d回合结束,本次运行共耗时%.3lf秒\n\n",a,t2)

    fprintf(p,"\n本次运行共耗时%.3lf秒\n",t2)

    if(n<m){n++goto onceagain}

    else

    {mmm=clock()t3=(double)(mmm-kkk)/CLOCKS_PER_SECprintf("本次程序完成所有任务共耗时%.3lf秒\n",t3)fprintf(p,"\n本次运行共耗时%.3lf秒\n",t3)

    system("pause")

    return 0}

}

我原创的,不要转载!转载请转载本页面地址!

目前我只会简单粗暴的穷举法,其他的就请另一位大神了。

代码如下:

#include <stdio.h>

int main()

{

printf("输出水仙花数:\n")

int i=100

for( i<1000i++){

int num_0 = i%10

int num_1 = i/10%10

int num_2 = i/10/10%10

if(i==(num_0*num_0*num_0+num_1*num_1*num_1+num_2*num_2*num_2))

printf("%d\t", i)

}

return 0

}

扩展资料

自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。

n为1时,自幂数称为独身数。显然,0,1,2,3,4,5,6,7,8,9都是自幂数。

n为2时,没有自幂数。

n为3时,自幂数称为水仙花数,有4个:153,370,371,407;

n为4时,自幂数称为四叶玫瑰数,共有3个:1634,8208,9474;

n为5时,自幂数称为五角星数,共有3个:54748,92727,93084;

n为6时,自幂数称为六合数, 只有1个:548834;

n为7时,自幂数称为北斗七星数, 共有4个:1741725,4210818,9800817,9926315;

n为8时,自幂数称为八仙数, 共有3个:24678050,24678051,88593477;

n为9时,自幂数称为九九重阳数,共有4个:146511208,472335975,534494836,912985153;

n为10时,自幂数称为十全十美数,只有1个:4679307774。

参考资料:

百度百科——水仙花数

#include "stdio.h"

#include<graphics.h>

#include "conio.h"

#include<stdlib.h>

#include<string.h>

void main()

{void adm1(),adm2(),build(),huan(),borrow(),dele()

adm1()

}

void adm1()

{ FILE *fp,*p

char adp[20],password[20]

int i,n=0

textbackground(2)

clrscr()

gotoxy(25,12)

fp=fopen("pass","r")

if(fp==NULL) { printf("no exit ")getch()exit(0)}

printf("input password:")

for()

{

window(42,12,53,12)

textbackground(0)

clrscr()

gets(adp)

for(i=0adp[i]!='\0'i++)

fgets(password,i+1,fp)

gotoxy(55,12)

if(strcmp(password,adp)==0)

{ window(55,12,70,12)clrscr()cprintf("YES")getch()adm2()getch()exit(0)}

else{ n++

window(55,12,60,12)clrscr()gotoxy(55,12)cprintf("error")

for(i=0i<30i++) delay(8000)

if(n==2)

{ window(55,12,70,12)clrscr()gotoxy(55,12)cprintf("once

again")for(i=0i<=30i++) delay(8000)}

if(n==3)

{ window(55,12,70,12)clrscr()gotoxy(55,12)cprintf("3 second

out")for(i=0i<=30i++) { delay(8000)}

exit(0)

}

}

fclose(fp)clrscr()

}

}

void adm2()

{ char a

window(1,1,80,25)

clrscr()

for()

{ clrscr()

gotoxy(30,8)printf("built a new user (B)")

gotoxy(30,10)printf("return book (R)")

gotoxy(30,12)printf("borrow books (J)")

gotoxy(30,14)printf("delete user (D)")

a=getch()

if(a=='b') build()

if(a=='r') huan()

if(a=='j') borrow()

if(a=='d') dele()

else continue

}

}

void build()

{ FILE *f,*p

char id[20],name[20],sex[2],age[3],grad[50]

window(1,1,80,25)

clrscr()

printf("ID number:")

scanf("%s",id)

printf("name:")

scanf("%s",name)

printf("sex:")

scanf("%s",sex)

printf("grad:")

scanf("%s",grad)

p=fopen(id,"w+")

if(p==NULL) { printf("can't build that user")getch()adm2()}

fprintf(p,"%s ",name)

fprintf(p,"%s ",id)

fprintf(p,"%s ",sex)

fprintf(p,"%s ",grad)

printf("bulid success")

getch()

fclose(p)

}

void huan()

{

FILE *fp,*p,*f

char id[20],a[5][50],name[20],c

int i=0,m,k clrscr()

printf("input ID number:")

scanf("%s",id)

p=fopen(id,"r")

if(p==NULL) { printf("error")getch()fclose(p)exit(0)}

fscanf(p,"%s",name)

fclose(p)

fp=fopen(name,"r")

do{ fscanf(fp,"%s",a[i++]) }while(!feof(fp))

for(k=0k<i-1k++) printf("\nbook %d: %s",k+1,a[k])

fclose(fp)

f=fopen(name,"w+")

for()

{

printf("\n\npress the book number that you want to return. \n

\nPress 6 if you want to return all. \n\npress 7 to cancle.\n")

scanf("%d",&m)

if(m==7) { for(k=0k<i-1k++)

{

fprintf(f,"%s\n",a[k])

}

fclose(f)

adm2()

}

if(m==6) remove(name)

if(m<6)

for(k=0k<i-1k++)

{ if(k!=m-1)

fprintf(f,"%s\n",a[k])

}

printf("book %d has returned.",m)

printf("\ncontinue? (Y/N)")

c=getch()

if(c=='y') continue

if(c=='n') { fclose(f)adm2()}

}

}

void borrow()

{ FILE *f,*m,*p

char id[20],book[5][50],name[20],c

int i=0,n=0,k

window(1,1,80,25)clrscr()

printf("please input the user's ID:")

scanf("%s",id)

m=fopen(id,"r")

if(m==NULL) { printf("user no exit")getch()fclose(m)adm2()}

fscanf(m,"%s",name)

fclose(m)

p=fopen(name,"r")

if(p==NULL)

else

{ while(!feof(p))

{

fscanf(p,"%s",book[i])

i++

}

i--

for(k=0k<ik++) printf("\nbook %d :%s",k+1,book[k])

}

fclose(p)

f=fopen(name,"w")

printf("\nhow many book do you want to borrow?:")

do{printf("\ninput:")scanf("%d",&n) }while(i+n>=6)

for(k=ik<i+nk++)

{ printf("\nbook %d :",k+1)

scanf("%s",book[k])

}

for(k=0k<i+nk++) fprintf(f,"%s\n",book[k])

fputc('\0',f)

printf("success")

fclose(f)

}

void dele()

{ FILE *fp,*f

char id[20],a[4][20],c,b[5][50]

int i=0,j=0,k

window(1,1,80,25)clrscr()

printf("Input ID number:")

scanf("%s",id)

fp=fopen(id,"r")

if(fp==NULL) { printf("\nuser isn't exit")getch()

fclose(fp)adm2()}

else while(!feof(fp))

{ fscanf(fp,"%s",a[i++])}

printf("\nname: %s",a[0])

printf("\nID: %s",a[1])

printf("\nsex: %s",a[2])

printf("\ngrad: %s",a[3])

f=fopen(a[0],"r")

if(f==NULL)

else {

while(!feof(f))

{ fscanf(f,"%s",b[j++])}

for(k=0k<j-1k++) printf("\nbook %d: %s",k+1,b[k])

}

printf("\nDo you want to delete? (Y/N): ")

c=getch()

fclose(fp)

fclose(f)

if(c=='y')

{ remove(id)remove(a[0])printf("\nsuccess")getch()adm2()}

if(c=='n') adm2()