首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向数组插入数字

向数组插入数字
EN

Stack Overflow用户
提问于 2022-03-23 12:54:51
回答 1查看 126关注 0票数 0

我需要用指针算法在数组中插入他的数字的每一个数字和。不允许使用辅助数组。

示例:

代码语言:javascript
复制
123, 456, 789

输出:

代码语言:javascript
复制
123, 6, 456, 15, 789, 24

代码:

代码语言:javascript
复制
#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);
}

这是正确的,但我不理解指针的代码部分。你能解释一下这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-24 00:38:56

我已经格式化了函数add,并添加了一些注释来解释它,我希望它们能够澄清正在发生的事情。请注意,arr[i] == *(arr + i)*arr == arr[0]

代码语言:javascript
复制
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]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71587622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档