函数从我的作业返回0无论我做什么

  • 本文关键字:返回 作业 函数 c
  • 更新时间 :
  • 英文 :


创建一个函数,以数字n作为参数,并返回小于或等于n且数字和最大的整数

例子:

largestDigitSum(100) ➞ 99
// Digit Sum for 99 = 9 + 9 = 18
// All numbers from 0 to 98 and 100 itself have digit sum lesser than 18.
largestDigitSum(48) ➞ 48
// Digit sum for 48 = 4 + 8 =12
// Digit sum for 39 = 3 + 9 =12
// Return 48 because 48 > 39
largestDigitSum(10) ➞ 9

所以基本上我尝试解决这个问题,但无论我做什么,函数都会返回0。下面是我的编码尝试:

int largestDigitSum(int n)
{
int s1 = 0, s2, c, maxi;
while (n > 0) {
c = n % 10;
s1 += c;
n /= 10;
}
while (n > 0) {
n--;
while (n > 0) {
c = n % 10;
s2 += c;
n /= 10;
}
if (s1 > s2)
maxi = n;
else
s1 = s2;
}
return maxi;
}

谁能解释一下我做错了什么?编辑:

好的,感谢所有帮助我理解这个问题的人。我试着把它分成两个函数,现在它工作了!下面是我的新代码:

int digitSum(int n)
{int s=0;
while(n>0)
{s += n%10;
n/=10;}
return s;
}
int largestDigitSum(int n)
{int i, maxi=1;
for(i=2;i<=n;i++)
if(digitSum(i) >= digitSum(maxi))
maxi=i;
return maxi;
}
int largestDigitSum(int n)
{
int s1 = 0, s2, c, maxi;
while (n > 0) {
c = n % 10;
s1 += c;
n /= 10; // This loop will never end until n becomes 0
}
while (n > 0) { // n is 0 because of the last loop
n--; // this will never enter
while (n > 0) {
c = n % 10;
s2 += c;
n /= 10;
}
if (s1 > s2)
maxi = n; // this will never be called
else
s1 = s2;
}
return maxi; // maxi is never being initialized to begin with
}

maxi甚至没有被初始化,所以您看到的0仅仅是未定义行为的结果。这就是为什么这个函数总是返回0。

  1. 此任务仅在输入数字为无符号时才有意义。如果它是签名的,你应该搜索到INT_MIN(如anynumner>= INT_MIN)。

use function for repeat tasks.

unsigned sumdigits(unsigned x)
{
unsigned sum = 0;
while(x) 
{
sum += x % 10;
x /= 10;
}
return sum;
}
unsigned brutForce(unsigned x)
{
unsigned cmax = 0, csum, maxnum;
while(x)
{
csum = sumdigits(x);
if(csum > cmax) {cmax = csum; maxnum = x;}
x--;
}
return maxnum;
}

int main(void)
{
printf("Max number: %un", brutForce(100000));
}

当然还有更有效的方法。

最好将要最大化的函数的求值与寻求最大值的实际过程分开:

static unsigned int
sum_of_digits(unsigned int n)
{
unsigned int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}

这样,你就可以对"数字之和"进行推理。功能与任何其他逻辑分开。

我对给我期望结果(argmax)的整数和最大值都感兴趣。因此,我声明了一个可以同时保存两个值的结构体:

struct max_result {
unsigned int argmax;
unsigned int max;
};

现在,我可以写一个函数,在一个范围内寻找另一个函数的最大值:

static struct max_result *
max_value_of_function(
unsigned int n,
unsigned int (*fn)(unsigned int)
)
{
unsigned int i = 1;
struct max_result *r = malloc(sizeof(*r));
assert(r);
r->argmax = 0;
r->max = 0;
do {
unsigned int s = fn(i);
if (s >= r->max) {
r->max = s;
r->argmax = i;
}
if (i == n) {
break;
}
++i;
} while (1);
return r;
}

这意味着你可以专注于寻求最大值的逻辑,而不是计算一个数字的数字之和。

当写这样的东西时,从一些测试用例开始总是有用的。不需要做任何花哨的事情……将给定输入的预期输出与函数的实际返回值进行比较的东西。我把你问题中列出的案例加上另外两个有趣的案例。

#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
struct max_result {
unsigned int argmax;
unsigned int max;
};
struct test_case {
const unsigned int input;
const unsigned int expected;
};
static
int sum_of_digits(unsigned int n)
{
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
static struct max_result *
max_value_of_function(
unsigned int n,
unsigned int (*fn)(unsigned int)
)
{
unsigned int i = 1;
struct max_result *r = malloc(sizeof(*r));
assert(r);
r->argmax = 0;
r->max = 0;
do {
unsigned int s = fn(i);
if (s >= r->max) {
r->max = s;
r->argmax = i;
}
if (i == n) {
break;
}
++i;
} while (1);
return r;
}
int
main(void) {
int i;
struct test_case cases[] = {
{ 0, 0 }, { 100, 99 }, { 48, 48 }, { 10, 9 }, { UINT_MAX, 3999999999U },
};
for (i = 0; i < sizeof(cases)/sizeof(cases[0]); ++i) {
struct max_result *r = max_value_of_function(cases[i].input, sum_of_digits);
if (r->argmax == cases[i].expected) {
printf(
"The positive integer with largest sum of digits in [0, %u] is %un"
"Sum of its digits is %un",
cases[i].input,
r->argmax,
r->max
);
}
else {
printf("Got %u ... expected %un", r->argmax, cases[i].expected);
}
}
return 0;
}

相关内容

  • 没有找到相关文章

最新更新