fabvy12 发表于 2019-11-5 00:54:56

一道函数题

这是题目
水仙花数是指一个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={0};
       
        for(i=0;;i++){
                a=number%10;
                number=number/10;
                count++;
                if(number<0)
                break;
        }
        for(i=0;i<count;i++)
        {
                sum=sum+pow(a,count);
                if(sum==number)
                {
                        flag=1;
                }
        }
        return flag;
}
void PrintN( int m, int n )
{
        while(m<n){
                if(narcissistic(m))
                printf("%d\n",m);
        }
}

bin554385863 发表于 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 = number % 10;
      number /= 10;
      count = k;
}

jackz007 发表于 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>

fabvy12 发表于 2019-11-5 12:41:30

bin554385863 发表于 2019-11-5 03:08
之前代码不准确,下班重写
for(i=0;;i++){
                a[\i] =number%10;


为什么要用a,其实我用a发生了段错误 找不出原因

fabvy12 发表于 2019-11-5 12:43:04

jackz007 发表于 2019-11-5 10:38


炒鸡谢谢!虽然我不是要代码 主要是我想解决我的疑惑的地方,

bin554385863 发表于 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>

bin554385863 发表于 2019-11-5 12:53:30

fabvy12 发表于 2019-11-5 12:43
炒鸡谢谢!虽然我不是要代码 主要是我想解决我的疑惑的地方,

这个问题 不知道怎么说,你字写一次玖明白了,何况不一定要用数组

fabvy12 发表于 2019-11-5 12:57:51

bin554385863 发表于 2019-11-5 12:53
这个问题 不知道怎么说,你字写一次玖明白了,何况不一定要用数组

我知道可以不用数组,但是我觉得这样好玩,其实我还写了另一个代码,这个用数组的,运行超时了。我刚刚改成你那样子,好像不行

fabvy12 发表于 2019-11-5 12:59:48

bin554385863 发表于 2019-11-5 12:53
这个问题 不知道怎么说,你字写一次玖明白了,何况不一定要用数组

你看看我的自定义函数这里,调用幂函数。这里有木有问题
#include<math.h>
int narcissistic( int number )
有木有错误,如果是错的,
我想达到这个 在自定义函数里面调用幂函数,该怎么调用

bin554385863 发表于 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;
      }
}

fabvy12 发表于 2019-11-5 22:37:48

bin554385863 发表于 2019-11-5 15:41
那个函数的用法没错。
for(i=0;;i++)
{


天呐 谢谢!我一直以为1/10等于负数

bin554385863 发表于 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>

fabvy12 发表于 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 牛
页: [1]
查看完整版本: 一道函数题