| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2076 人关注过本帖
标题:"水仙花“数
只看楼主 加入收藏
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
[bo][un]hoodlum1980[/un] 在 2008-10-23 12:11 的发言:[/bo]

这道题本质上其实是大数加法。把每一位的立方累加就行了。最后判断一下两个数组是否相等,没有复杂性。

谁告诉你只有立方???????????
拜托了,说题目简单的,都是些不懂题目的,还有想当然的
2008-10-23 12:21
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
[bo][un]蓝色线段树[/un] 在 2008-10-23 12:21 的发言:[/bo]


谁告诉你只有立方???????????
拜托了,说题目简单的,都是些不懂题目的,还有想当然的



我理解的题目是:所谓的“水仙数”是指该数各位数的立方和等于这个数本身。如153就是,因为1*1*1+5*5*5+3*3*3=153。

个位数的立方,最大就是9^3=729。然后累加这些数字而已。题目要求是输入一个数字判断它是否是符合条件。

[[it] 本帖最后由 hoodlum1980 于 2008-10-23 14:51 编辑 [/it]]
2008-10-23 14:50
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
请你重新看看我在5楼所说的话
2008-10-23 15:01
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
146511208 = 1^9 * 3 + 2^9 + 4^9 + 5^9 + 6^9 + 8^9

假如不是输入一个数判断一个数,而是你自己把这些数都找出来
你怎么写代码??
2008-10-23 15:05
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
那你把问题描述清楚不久行了吗!!!

下面的代码可以判断一个数字是否是水仙花数。

但寻找n位水仙花数的时候,由于从各位开始累加1计数,所以速度过慢。

程序代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char number[200];
int sum[200];
int pow[10][200]; /*存储1~9的n次幂*/

/* a= a*k, a是大数,k是0~9的数字!*/
void multiply(int a[], int k)
{
    int i,j;
    for(i=1;i<=a[0];i++)
        a[i] *= k;
    for(i=1;i<=a[0];i++)
    {
        a[i+1]+=a[i]/10;
        a[i]=a[i]%10;
    }
    if(a[ a[0]+1 ]!=0) a[0]++;
}

/*计算出0~9的n次方,缓存入数组B*/
void InitPow(int n)
{
    int i,j;
    memset(pow,0,sizeof(pow));
    pow[1][0]=pow[1][1]=1;

    for(i=2;i<10;i++)
    {
        pow[i][0]=1;
        pow[i][1]=i;
        for(j=1;j<n;j++)
            multiply(pow[i],i);
    }
}

void formular(int a[])
{
    int i;
    if(a[a[0]]>9) a[0]++;
    for(i=1;i<=a[0];i++)
    {
        a[i+1]+=a[i]/10;
        a[i]=a[i]%10;
    }
}

void Add(int a[], int b[])
{
    int i;
    a[0]=max(a[0],b[0]);
    for(i=1;i<=b[0];i++)
    {
        a[i]+=b[i];
    }
    formular(a);
}

/*需要先初始化数组B*/
int IsShuiXian(const char* num)
{
    int i;
    char *s=num;
    memset(sum, 0, sizeof(sum));
    while(*s)
    {
        Add(sum, pow[*s-'0']);
        s++;
    }
    /*判断是否是水仙花*/
    if(strlen(num)!=sum[0]) return 0;
    for(i=1;i<=sum[0];i++)
        if(sum[i]!=num[sum[0]-i]-'0')
            return 0;
    /*是水仙花*/
    return 1;
}

/*输出N位的水仙花数 n>=2*/
void OutPutN(int n)
{
    int i,j,k;
    char temp[100];
    InitPow(n);
    memset(number,'0',n);
    memset(temp,'9',n);
    number[0]='1';
    temp[n]=number[n]=0;
    do
    {
        number[n-1]++;
        i=n-1;
        while(i>0 && number[i]>'9')
        {
            number[i]='0';
            i--;
            number[i]++;
        }
        if(IsShuiXian(number))
            printf(" %s \n", number);
    }
    while(strcmp(number,temp));
}

void main()
{
    int n;
    printf("input a number to judge: \n");
    gets(number);
    InitPow(strlen(number));
    if(IsShuiXian(number))
        printf(" is.\n");
    else
        printf(" is not.\n");
        
    /*输出n位水仙花数*/
    printf("input n=? (n>2 && n<100)\n");
    scanf("%d",&n);
    OutPutN(n);
}
2008-10-23 17:58
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
我对你的要求不高,只要你的代码能在1秒内把所有8位和9位的水仙花数全部找出来就可以了
2008-10-23 18:02
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
你误会我意思了,我知道你会做优化,但我现在是给你一个确定的优化目标,1秒搜索完成

当然,你如果你的目标是0.01秒搜索完成9位数的,那你可以当我没有说过
2008-10-23 18:35
嬿·嘄·骊·戨
Rank: 2
来 自:天府之国
等 级:论坛游民
帖 子:84
专家分:25
注 册:2008-10-16
收藏
得分:0 
。。。

名字多好听勒```

没想到重求复杂````
2008-10-23 19:19
快速回复:"水仙花“数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017465 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved