我解决不了这个问题,我已经想了好几天了。以下是问题的全文:
编写一个函数,对于给定的非负整型
n
,返回9
出现的次数为数字,但9
的左边紧接另一个9
计数为双精度,因此9912349
的结果为4。
问题有两部分,a)和b)。
a)部分要求使用递归解决此问题,而
b)部分需要迭代。
我最头疼的是递归问题。下面是我的a)部分代码:
#include <stdio.h>
#include <stdlib.h>
/* Write a function that for a given a non-negative int n, computes the count of the
occurrences of 9 as a digit, except
that an 9 with another 9 immediately to its left counts double, so 9914329 yields 4. */
int recursiveNines(int mynumber) {
int counter = 0;
if (mynumber = 0) {
return 0;
}
if (mynumber / 10 == 9) {
counter++;
}
else if (mynumber / 10 == 9 && mynumber / 100 == 9) {
counter += 2;
}
return mynumber + recursiveNines(mynumber / 10);
}
我认为函数是好的,但我不确定如何返回最终计数器,因此测试我的函数。
下面是这个问题的迭代代码:
int iterateNines(int mynumber) {
int counter = 0;
do {
if (mynumber / 10 == 9) {
counter++;
}
else if (mynumber / 10 == 9 && mynumber / 100 == 9) {
counter+=2;
}
} while (mynumber != 0);
return counter;
}
有多重问题:
-
if (mynumber = 0)
有一个错字:这将0
赋值给mynumber
,并计算为false。 -
此外,您的测试
if (mynumber / 10 == 9)
不检查mynumber
的最后一位数字是否为9
:您应该使用if (mynumber % 10 == 9)
-
else
子句也不正确:如果最后一个数字已经是9
,则应该检查第二个9
。在else
分支中测试这个条件总是会失败。 -
return
语句不正确:您应该添加counter
,而不是mynumber
来递归调用。
以下是修改后的版本:
int recursiveNines(int mynumber) {
int counter = 0;
if (mynumber == 0) {
return 0;
}
if (mynumber % 10 == 9) {
counter++;
if (mynumber / 10 % 10 == 9)
counter++;
}
return counter + recursiveNines(mynumber / 10);
}
int iterateNines(int mynumber) {
int counter = 0;
while (mynumber != 0) {
if (mynumber % 10 == 9) {
counter++;
if (mynumber / 10 % 10 == 9) {
counter++;
}
mynumber /= 10;
}
return counter;
}
这里是使用单个表达式的递归版本的替代方案:
int recursiveNines(int n) {
return (n == 0) ? 0 :
(n % 10 == 9) + (n % 100 == 99) + recursiveNines(n / 10);
}
几个问题:
mynumber = 0
代替mynumber == 0
else if (mynumber / 10 == 9 && mynumber / 100 == 9)
分支将永远不会被占用,因为第一个分支将首先被占用。- 使用除法(
/
)而不是取模(%
)。
尝试:
int recursiveNines(int mynumber) {
int counter = 0;
if (mynumber == 0) {
return 0;
}
if (mynumber % 100 == 99) {
counter = 2;
} else if (mynumber % 10 == 9) {
counter = 1;
}
return counter + recursiveNines(mynumber / 10);
}