鱼C论坛

 找回密码
 立即注册
查看: 1766|回复: 12

[已解决]一道函数题

[复制链接]
发表于 2019-11-5 00:54:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是题目
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1^3+5^3+3^3;
本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。

然后这是我的代码   //疑惑点1,为什么放在中间,调用函数 PrintN(m, n); 的时候。疑惑点2 是为什么我这个运行之后会发生段错误,难道数组不可以这样用嘛?求助。救救孩子吧
#include <stdio.h>

int narcissistic( int number );
void PrintN( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);//为什么放在中间
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}

#include<math.h>
int narcissistic( int number )
{
        int count=0,i,flag=0,sum=0;
        int a[100]={0};
       
        for(i=0;;i++){
                a[i]=number%10;
                number=number/10;
                count++;
                if(number<0)
                break;
        }
        for(i=0;i<count;i++)
        {
                sum=sum+pow(a[i],count);
                if(sum==number)
                {
                        flag=1;
                }
        }
        return flag;
}
void PrintN( int m, int n )
{
        while(m<n){
                if(narcissistic(m))
                printf("%d\n",m);
        }
}
最佳答案
2019-11-5 15:41:46
本帖最后由 bin554385863 于 2019-11-5 22:25 编辑
fabvy12 发表于 2019-11-5 12:59
你看看我的自定义函数这里,调用幂函数。这里有木有问题
#include
int narcissistic( int number )


那个函数的用法没错。
for(i=0;;i++)
{
        a[\i]=number%10;
        number=number/10;
        count++;
        if(number<0)//问题可能出在这,number 是不会小于0的,所以这个条件永远不会成立,他只会大于等于0,大于小于0都不合适,所以这里应该是不等于0;
        break;
        }
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-5 03:08:50 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-5 12:20 编辑

之前代码不准确,下班重写
for(i=0;;i++){
                a[\i] =number%10;
                number=number/10;
                count++;
                if(number<0)
                break;
        }
改成下面试试
for(int k=0;number != 0;k++)
{
        a[k] = number % 10;
        number /= 10;
        count = k;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-5 10:38:21 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-5 10:44 编辑
#include <stdio.h>

int narcissistic(int number)
{
        int d , e , k , ret = 0                                                     ;
        if(number > 0) {
                for(d = number , e = 0 ; d ; k = d % 10 , e += k * k * k , d /= 10) ;
                if(number == e) ret = 1                                             ;
        }
        return ret                                                                  ;
}

void PrintN(int m , int n)
{
        int k                                                                                                ;
        if(m > 0 && n > 0 && m + 1 < n) for(k = m + 1 ; k < n ; k ++) if(narcissistic(k)) printf("%d\n" , k) ;
}

int main()
{
    int m , n                                                       ;
    scanf("%d%d" , & m , & n)                                       ;
    if(narcissistic(m)) printf("%d is a narcissistic number\n" , m) ;
    PrintN(m , n)                                                   ;
    if(narcissistic(n)) printf("%d is a narcissistic number\n" , n) ;
}
C:\Bin>g++ -o x x.c

C:\Bin>x
99 1000
153
370
371
407

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 12:41:30 | 显示全部楼层
bin554385863 发表于 2019-11-5 03:08
之前代码不准确,下班重写
for(i=0;;i++){
                a[\i] =number%10;

为什么要用a[k],其实我用a[i]发生了段错误 找不出原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 12:43:04 | 显示全部楼层

炒鸡谢谢!虽然我不是要代码 主要是我想解决我的疑惑的地方,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-5 12:50:44 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-6 11:10 编辑
#include <stdio.h>
#include <math.h>
int digitnum(int dig)
{
    int count = 0, num = abs(dig);
    while (num != 0 )
    {
        num /= 10;
        count++;
    }
    return count;
}
int narcissistic(int number)
{
    int tmp = number, sum = 0, s = digitnum(tmp);
    switch ((number > 0)&&(number < __INT32_MAX__) ? 1 : 0)
    {
    case 0:
        printf("DATE ERROR\n");
        break;
    case 1:
        while (number)
        {
            int t = number % 10;
            number /= 10;
            sum += pow(t, s);
        }
        break;
    }
    return (sum == tmp ? 1 : 0);
}
void PrintN(int min, int max)
{
    switch ((min < max ? min : max) > 0 ? 1 : 0) 
    {
    case 0:
        printf("DATE ERROR\n");
        break;
    case 1:
        for (size_t i = min; i <= max; i++)
        {
            switch (narcissistic(i))
            {
            case 0:
                continue;
                break;
            case 1:
                printf("%d\n", i);
                break;
            }   
        }
    }
}
int main(int argc, char const *argv[])
{
    int a = 0, b = 0;
    printf("请输入下限(>0),上限\n");
    scanf("%d%d", &a, &b);
    printf("百合花数为\n");
    PrintN(a, b);
    return 0;
}
------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.418]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-iv25msor.r0z --stdout=Microsoft-MIEngine-Out-0bprluxx.njt --stderr=Microsoft-MIEngine-Error-hwhabnkr.3ux --pid=Microsoft-MIEngine-Pid-lwvxsvc4.l2p --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
请输入下限(>0),上限
100 90000
百合花数为
153
370
371
407
1634
8208
9474
54748


E:\Users\admin\Documents\VScode>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-5 12:53:30 | 显示全部楼层
fabvy12 发表于 2019-11-5 12:43
炒鸡谢谢!虽然我不是要代码 主要是我想解决我的疑惑的地方,


这个问题 不知道怎么说,你字写一次玖明白了,何况不一定要用数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 12:57:51 | 显示全部楼层
bin554385863 发表于 2019-11-5 12:53
这个问题 不知道怎么说,你字写一次玖明白了,何况不一定要用数组

我知道可以不用数组,但是我觉得这样好玩,其实我还写了另一个代码,这个用数组的,运行超时了。我刚刚改成你那样子,好像不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 12:59:48 | 显示全部楼层
bin554385863 发表于 2019-11-5 12:53
这个问题 不知道怎么说,你字写一次玖明白了,何况不一定要用数组

你看看我的自定义函数这里,调用幂函数。这里有木有问题
#include<math.h>
int narcissistic( int number )
有木有错误,如果是错的,
我想达到这个 在自定义函数里面调用幂函数,该怎么调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-5 15:41:46 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 bin554385863 于 2019-11-5 22:25 编辑
fabvy12 发表于 2019-11-5 12:59
你看看我的自定义函数这里,调用幂函数。这里有木有问题
#include
int narcissistic( int number )


那个函数的用法没错。
for(i=0;;i++)
{
        a[\i]=number%10;
        number=number/10;
        count++;
        if(number<0)//问题可能出在这,number 是不会小于0的,所以这个条件永远不会成立,他只会大于等于0,大于小于0都不合适,所以这里应该是不等于0;
        break;
        }
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 22:37:48 | 显示全部楼层
bin554385863 发表于 2019-11-5 15:41
那个函数的用法没错。
for(i=0;;i++)
{

天呐 谢谢!我一直以为1/10等于负数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 00:21:43 | 显示全部楼层
fabvy12 发表于 2019-11-5 22:37
天呐 谢谢!我一直以为1/10等于负数

不会
假设有:   m > n >0&&m%n != 0则 n / m = 0, n % m= n;
#include <iostream>
#include <array>
int main(int argc, char const *argv[])
{
    std::array<int, 10> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::array<int, 10> arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11};
    for (int i : arr)
    {
        for (int j : arr1)
        {
            if ((j != i) && (j < i))
            {
                std::cout << j << "/ " << i << " = " << j / i << "   ";
                std::cout << j << " % " << i << " = " << j % i << std::endl;
            }
        }
    }
    return 0;
}
-----------------------------------------------------------------------
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS E:\Users\admin\Documents\VScode> & 'c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-dil1psuq.zyj' '--stdout=Microsoft-MIEngine-Out-4phhfec2.d3q' '--stderr=Microsoft-MIEngine-Error-l3e00pgz.mls' '--pid=Microsoft-MIEngine-Pid-garl0zf3.kjl' '--dbgExe=D:\MinGW\bin\gdb.exe' '--interpreter=mi'
1/ 2 = 0   1 % 2 = 1
1/ 3 = 0   1 % 3 = 1
2/ 3 = 0   2 % 3 = 2
1/ 4 = 0   1 % 4 = 1
2/ 4 = 0   2 % 4 = 2
3/ 4 = 0   3 % 4 = 3
1/ 5 = 0   1 % 5 = 1
2/ 5 = 0   2 % 5 = 2
3/ 5 = 0   3 % 5 = 3
4/ 5 = 0   4 % 5 = 4
1/ 6 = 0   1 % 6 = 1
2/ 6 = 0   2 % 6 = 2
3/ 6 = 0   3 % 6 = 3
4/ 6 = 0   4 % 6 = 4
5/ 6 = 0   5 % 6 = 5
1/ 7 = 0   1 % 7 = 1
2/ 7 = 0   2 % 7 = 2
3/ 7 = 0   3 % 7 = 3
4/ 7 = 0   4 % 7 = 4
5/ 7 = 0   5 % 7 = 5
6/ 7 = 0   6 % 7 = 6
1/ 8 = 0   1 % 8 = 1
2/ 8 = 0   2 % 8 = 2
3/ 8 = 0   3 % 8 = 3
4/ 8 = 0   4 % 8 = 4
5/ 8 = 0   5 % 8 = 5
6/ 8 = 0   6 % 8 = 6
7/ 8 = 0   7 % 8 = 7
1/ 9 = 0   1 % 9 = 1
2/ 9 = 0   2 % 9 = 2
3/ 9 = 0   3 % 9 = 3
4/ 9 = 0   4 % 9 = 4
5/ 9 = 0   5 % 9 = 5
6/ 9 = 0   6 % 9 = 6
7/ 9 = 0   7 % 9 = 7
8/ 9 = 0   8 % 9 = 8

PS E:\Users\admin\Documents\VScode>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-7 18:36:02 | 显示全部楼层
bin554385863 发表于 2019-11-6 00:21
不会
假设有:   m > n >0&&m%n != 0则 n / m = 0, n % m= n;

兄die 牛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 13:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表