将数字插入数组
Insert numbers to array
我需要使用指针算法为数组中的每个数字总和插入他的数字。不允许使用辅助数组。
示例:
123, 456, 789
输出:
123, 6, 456, 15, 789, 24
代码:
#include <stdio.h>
int sum_of_digits(int n){
int sum=0;
while(n!=0){
sum=sum+n%10;
n/=10;
}
return sum;
}
void add(int *arr, int n)
{
int *p=arr, *y=arr+n*2-2,i;
while(p++<arr+n);
p-=2;
while(p>arr)
{
*y=*p;
*p=0;
p--;
y-=2;
}
p=arr;
while(p<arr+n*2)
{
*(p+1)=sum_of_digits(*p);
p+=2;
}
for(i=0;i<n;i++)
printf("%d ", arr[i]);
}
void main() {
int arr[20]={123, 456, 789},n=3;
add(arr,n*2);
}
这工作正确,但我不理解带有指针的代码部分。你能解释一下这是怎么回事吗?
我已经格式化函数 add
并添加了一些注释来解释它,我希望他们能澄清发生了什么。
请注意 arr[i] == *(arr + i)
和 *arr == arr[0]
void add(int *arr, int n)
{
// p points to last number in arr
// Equivalent to &arr[n-1]
int *p = arr + n - 1;
// y points to where last number will be after spreading
// Equivalent to &arr[2*n - 2]
int *y = arr + n * 2 - 2;
// for n = 4 arr looks like this
// [A, B, C, D, _, _, _, _]
// ^ ^
// p y
// Spread numbers of arr
// [A, B, C, D, _, _, _, _] -> [A, _, B, _, C, _, D, _]
while (p > arr)
{
// Copy D to last position
*y = *p;
// Zero original D location, unnecessary
*p = 0;
// Move p backwards by one
p--;
// Move y backwards by two
y -= 2;
// arr now looks like this
// [A, B, C, _, _, _, D, _]
// ^ ^
// p y
// After next iteration
// [A, B, _, _, C, _, D, _]
// ^ ^
// p y
// After next iteration
// [A, _, B, _, C, _, D, _]
}
// Iterate over every other value
// and assign arr[i+1] to sum_of_digits[i]
p = arr;
while (p < arr + n * 2)
{
*(p + 1) = sum_of_digits(*p);
p += 2;
}
// Equivalent to
// for (int i = 0; i < n * 2; i += 2) {
// arr[i + 1] = sum_of_digits(arr[i]);
// }
// [A, sum_of_digits(A), B, sum_of_digits(B), C, sum_of_digits(C),
// D, sum_of_digits(D)]
// Print array
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
}
我需要使用指针算法为数组中的每个数字总和插入他的数字。不允许使用辅助数组。
示例:
123, 456, 789
输出:
123, 6, 456, 15, 789, 24
代码:
#include <stdio.h>
int sum_of_digits(int n){
int sum=0;
while(n!=0){
sum=sum+n%10;
n/=10;
}
return sum;
}
void add(int *arr, int n)
{
int *p=arr, *y=arr+n*2-2,i;
while(p++<arr+n);
p-=2;
while(p>arr)
{
*y=*p;
*p=0;
p--;
y-=2;
}
p=arr;
while(p<arr+n*2)
{
*(p+1)=sum_of_digits(*p);
p+=2;
}
for(i=0;i<n;i++)
printf("%d ", arr[i]);
}
void main() {
int arr[20]={123, 456, 789},n=3;
add(arr,n*2);
}
这工作正确,但我不理解带有指针的代码部分。你能解释一下这是怎么回事吗?
我已经格式化函数 add
并添加了一些注释来解释它,我希望他们能澄清发生了什么。
请注意 arr[i] == *(arr + i)
和 *arr == arr[0]
void add(int *arr, int n)
{
// p points to last number in arr
// Equivalent to &arr[n-1]
int *p = arr + n - 1;
// y points to where last number will be after spreading
// Equivalent to &arr[2*n - 2]
int *y = arr + n * 2 - 2;
// for n = 4 arr looks like this
// [A, B, C, D, _, _, _, _]
// ^ ^
// p y
// Spread numbers of arr
// [A, B, C, D, _, _, _, _] -> [A, _, B, _, C, _, D, _]
while (p > arr)
{
// Copy D to last position
*y = *p;
// Zero original D location, unnecessary
*p = 0;
// Move p backwards by one
p--;
// Move y backwards by two
y -= 2;
// arr now looks like this
// [A, B, C, _, _, _, D, _]
// ^ ^
// p y
// After next iteration
// [A, B, _, _, C, _, D, _]
// ^ ^
// p y
// After next iteration
// [A, _, B, _, C, _, D, _]
}
// Iterate over every other value
// and assign arr[i+1] to sum_of_digits[i]
p = arr;
while (p < arr + n * 2)
{
*(p + 1) = sum_of_digits(*p);
p += 2;
}
// Equivalent to
// for (int i = 0; i < n * 2; i += 2) {
// arr[i + 1] = sum_of_digits(arr[i]);
// }
// [A, sum_of_digits(A), B, sum_of_digits(B), C, sum_of_digits(C),
// D, sum_of_digits(D)]
// Print array
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
}