C语言 编写一个函数,对于给定的非负整数n,返回9出现的次数



我解决不了这个问题,我已经想了好几天了。以下是问题的全文:

编写一个函数,对于给定的非负整型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);
}

相关内容

  • 没有找到相关文章

最新更新