如何使用递归函数查看某个数字并提取小于5的数字?

时间:2014-12-22 23:21:54

标签: c recursion

再次是我。我删除了我之前的问题,因为它的问题非常糟糕,我甚至没有包含任何代码(我在这个网站上是新的,在C上是新的)。所以我需要编写一个程序,打印出给定数字中小于5的数字和数字的数字。

例如:5427891应为421 - 3

该赋值还指出我需要使用void在递归函数中打印小于5的数字。

这是我到目前为止所写的内容

#include<stdio.h>
void countNum(int n){
  //no idea how to start here       
}

int main()
{
  int num, count = 0;

  scanf("%d", &num);
  while(num != 0){
      num /= 10;           
      ++count;
  }
  printf(" - %d\n", count);


  }

我已经编写了计算位数的主函数,我的想法是,我将分配(不确定我在这里使用正确的单词)num整数到CountNum来计算数字的位数结果。然而,这是我被卡住的地方。我不知道如何在我的void函数中提取和打印数字&lt; 5。有什么提示吗?

编辑:

我尝试了一种不同的方法(不使用void并重新开始),但现在我得到了我需要的数字,除了反过来。例如,不是打印1324而是获得4231。

这是代码

#include <stdio.h>
int rec(int num){
    if (num==0) {
       return 0;

              }
    int dg=0;
    if(num%10<5){
        printf("%d", num%10);
    dg++;
    }

    return rec(num/10);
}
int main(){
int n;
    scanf("%d", &n);
    int i,a;
    for(i=0;i<n;i++)
    {
    scanf("%d", &a);
     rec(a);
        printf(" \n");
    }



return 0;
}

为什么会发生这种情况,我应该如何解决?

4 个答案:

答案 0 :(得分:2)

修改以打印从最重要到最不重要的值。

使用余数运算符%

  

“/运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数。在两个操作中,如果值为第二个操作数为零,行为未定义“C11dr§6.5.5

在每次递归时,找到最低有效数字并进行测试。然后将数字除以10并在需要时递归。在递归调用后打印此值(如果有)。

static int PrintSmallDigit_r(int num) {
  int count = 0;
  int digit = abs(num % 10);
  num /= 10;
  if (num) {
    count = PrintSmallDigit_r(num);
  }
  if (digit < 5) {
    count++;
    putc(digit + '0', stdout);
  }
  return count;
}

void PrintSmallDigits(int num) {
  printf(" - %d\n", PrintSmallDigit_r(num));
}

int main(void) {
  PrintSmallDigits(5427891);
  PrintSmallDigits(-5427891);
  PrintSmallDigits(0);
  return 0;
}

Output
421 - 3
421 - 3
0 - 1

注意:
此方法适用于0和负数。

答案 1 :(得分:2)

您的问题中没有任何内容指明输入的数字是实际int的一部分。更确切地说,它恰好是(希望)在{ 0..9 }中的某个地方发生的一系列字符,代表一些非有界的数字

那就是说,你可以发送任意数量的数字字符到下面的数字,无论是一个还是一百万个,都没有区别。一旦遇到来自stdin的非数字或EOF,算法将展开并累积您寻找的总数。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int countDigitsLessThanFive()
{
    int c = fgetc(stdin);
    if (c == EOF || !isdigit((unsigned char)c))
        return 0;

    if (c < '5')
    {
        fputc(c, stdout);
        return 1 + countDigitsLessThanFive();
    }
    return countDigitsLessThanFive();
}

int main()
{
    printf(" - %d\n", countDigitsLessThanFive());
    return EXIT_SUCCESS;
}

示例输入/输出

1239872462934800192830823978492387428012983
1232423400123023423420123 - 25

12398724629348001928308239784923874280129831239872462934800192830823978492387428012983
12324234001230234234201231232423400123023423420123 - 50

我有点怀疑这不是你要找的东西,但是我会把它留在这里足够长的时间让你偷看之前。对于递归的有用的演示,这个算法毫无意义,说实话,但至少证明递归是非常简单的。

答案 2 :(得分:1)

首先,你写的不是递归。这个想法是该函数每次都会用较少的数字调用自己,直到它们全部检查它们为止。

以下是一个片段,可以帮助您理解这个想法:

int countNum(int val)
{
  if(!val) return 0;
  return countNum(val/10) + ((val % 10) < 5);
}

答案 3 :(得分:-1)

void countNum(int n, int *c){
    if(n != 0){
        int num = n % 10;
        countNum(n / 10, c);
        if(num < 5){
            printf("%d", num);
            ++*c;
        }
    }
}

int main(){
    int num, count = 0;

    scanf("%d", &num);
    countNum(num, &count);
    printf(" - %d\n", count);

    return 0;
}

for UPDATE

int rec(int num){
    if (num==0) {
        return 0;
    }
    int dg;
    dg = rec(num/10);//The order in which you call. 
    if(num%10<5){
        printf("%d", num%10);
        dg++;
    }

    return dg;
}

int main(){
    int n;
    scanf("%d", &n);

    int i,a;
    for(i=0;i<n;i++){
        scanf("%d", &a);
        printf(" - %d\n", rec(a));
    }

    return 0;
}