使用指针运算的数组数字总和
Sum of array digits using pointer arithmetic
我需要使用指针运算为所有数组元素写出数字总和。
程序应打印:0 1 2 5 8 16 14
#include <stdio.h>
void sumDigit(int arr[], int n) {
int *p = arr, m, sum;
while (p < arr + n) {
sum=0;
m = (*p) % 10;
sum += m;
(*p) /= 10;
p++;
printf("%d ", sum);
}
}
int main() {
int arr[] = {0, 1, 2, 14, 35, 97, 68};
int n = sizeof(arr) / sizeof(*arr);
sumDigit(arr, n);
return 0;
}
此代码仅打印最后数字 (0 1 2 4 5 7 8)。
这个任务如何实现指针运算?
可能在 general-chat 中持续了足够长的时间。您完全误解了作业的目的。目的是在不使用下标的情况下完成任务。例如。你不能这样做:
for (int i=0; i<n; ++i)
{
// do something with arr[i]
}
相反,他们希望您这样做:
int *p = arr;
while (p != arr+n)
{
// do something with *p, then....
++p;
}
就是它。对于手头的任务,至少有十几种方法可以做到这一点;我可以立即想到五个。一种方式如下所示:
#include <stdio.h>
void sumDigit(const int arr[], size_t n)
{
const int *stop = arr + n;
for (; arr != stop; ++arr)
{
int sum = 0;
int value = *arr;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
printf("%d ", sum);
}
fputc('\n', stdout);
}
int main()
{
int arr[] = {0, 1, 2, 14, 35, 97, 68};
size_t n = sizeof arr / sizeof *arr;
sumDigit(arr, n);
return 0;
}
输出
0 1 2 5 8 16 14
这是另一种方式:
void sumDigit(const int arr[], size_t n)
{
const int *p = arr;
while (p != arr+n)
{
int sum = 0;
int value = *p;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
printf("%d ", sum);
++p;
}
fputc('\n', stdout);
}
还有一个...
void sumDigit(const int arr[], size_t n)
{
for (const int *p = arr; p != arr+n; ++p)
{
int sum = 0;
int value = *p;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
printf("%d ", sum);
}
fputc('\n', stdout);
}
这里有一个,正如我在 general-comment 中所描述的,使用 purpose-driven 函数来计算提供的 int
值的 sum-of-digits,从而使实际的 sumDigit
很多更容易理解:
int sum_of_digits(int value)
{
int sum = 0;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
return sum;
}
void sumDigit(const int arr[], size_t n)
{
for (const int *p = arr; p != arr+n; ++p)
printf("%d ", sum_of_digits(*p));
fputc('\n', stdout);
}
所有这些都产生相同的输出,因为它们最终都做同样的事情。
您唯一需要的指针运算是 arr++
。需要变量 val
才能不破坏原始数组的内容。 return int
没有意义,因为数字总和不能为负数。还要使用正确的尺寸类型 (size_t
)
unsigned sumDigit(int arr[], size_t n)
{
int val;
unsigned sum = 0, psum;
while (n--)
{
val = *arr++;
psum = 0;
do
{
psum += abs(val % 10);
val /= 10;
}
while(val);
sum += psum;
printf("%u ", psum);
}
printf("\n");
return sum;
}
int main(void)
{
int arr[5] = {68876, -434554, 3456, 99999, -3435543};
printf("Sum of digits of all numbers in the array = %u\n", sumDigit(arr, 5));
}
我需要使用指针运算为所有数组元素写出数字总和。
程序应打印:0 1 2 5 8 16 14
#include <stdio.h>
void sumDigit(int arr[], int n) {
int *p = arr, m, sum;
while (p < arr + n) {
sum=0;
m = (*p) % 10;
sum += m;
(*p) /= 10;
p++;
printf("%d ", sum);
}
}
int main() {
int arr[] = {0, 1, 2, 14, 35, 97, 68};
int n = sizeof(arr) / sizeof(*arr);
sumDigit(arr, n);
return 0;
}
此代码仅打印最后数字 (0 1 2 4 5 7 8)。
这个任务如何实现指针运算?
可能在 general-chat 中持续了足够长的时间。您完全误解了作业的目的。目的是在不使用下标的情况下完成任务。例如。你不能这样做:
for (int i=0; i<n; ++i)
{
// do something with arr[i]
}
相反,他们希望您这样做:
int *p = arr;
while (p != arr+n)
{
// do something with *p, then....
++p;
}
就是它。对于手头的任务,至少有十几种方法可以做到这一点;我可以立即想到五个。一种方式如下所示:
#include <stdio.h>
void sumDigit(const int arr[], size_t n)
{
const int *stop = arr + n;
for (; arr != stop; ++arr)
{
int sum = 0;
int value = *arr;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
printf("%d ", sum);
}
fputc('\n', stdout);
}
int main()
{
int arr[] = {0, 1, 2, 14, 35, 97, 68};
size_t n = sizeof arr / sizeof *arr;
sumDigit(arr, n);
return 0;
}
输出
0 1 2 5 8 16 14
这是另一种方式:
void sumDigit(const int arr[], size_t n)
{
const int *p = arr;
while (p != arr+n)
{
int sum = 0;
int value = *p;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
printf("%d ", sum);
++p;
}
fputc('\n', stdout);
}
还有一个...
void sumDigit(const int arr[], size_t n)
{
for (const int *p = arr; p != arr+n; ++p)
{
int sum = 0;
int value = *p;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
printf("%d ", sum);
}
fputc('\n', stdout);
}
这里有一个,正如我在 general-comment 中所描述的,使用 purpose-driven 函数来计算提供的 int
值的 sum-of-digits,从而使实际的 sumDigit
很多更容易理解:
int sum_of_digits(int value)
{
int sum = 0;
while (value != 0)
{
sum += value % 10;
value /= 10;
}
return sum;
}
void sumDigit(const int arr[], size_t n)
{
for (const int *p = arr; p != arr+n; ++p)
printf("%d ", sum_of_digits(*p));
fputc('\n', stdout);
}
所有这些都产生相同的输出,因为它们最终都做同样的事情。
您唯一需要的指针运算是 arr++
。需要变量 val
才能不破坏原始数组的内容。 return int
没有意义,因为数字总和不能为负数。还要使用正确的尺寸类型 (size_t
)
unsigned sumDigit(int arr[], size_t n)
{
int val;
unsigned sum = 0, psum;
while (n--)
{
val = *arr++;
psum = 0;
do
{
psum += abs(val % 10);
val /= 10;
}
while(val);
sum += psum;
printf("%u ", psum);
}
printf("\n");
return sum;
}
int main(void)
{
int arr[5] = {68876, -434554, 3456, 99999, -3435543};
printf("Sum of digits of all numbers in the array = %u\n", sumDigit(arr, 5));
}