再次是我。我删除了我之前的问题,因为它的问题非常糟糕,我甚至没有包含任何代码(我在这个网站上是新的,在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;
}
为什么会发生这种情况,我应该如何解决?
答案 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;
}