C语言实践练习题----day9

题目一


题目描述

自除数 是指可以被它包含的每一位数整除的数。 例如,128 是一个 自除数 ,因为 128 % 1 == 0,128 % 2== 0,128 % 8 == 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。

思路
先解决判断一个数是否是自除数的函数(类似给你一个数,让你判断这个数是几位数题型改版),isSelfDividing函数,先循环嵌套判断函数,得出自除数的个数,然后定义动态内存数组,再将自除数放进去,最后返回数组,在最后main()中,动态内存分配用完
记得free(数组),释放指针

#include <stdlib.h>

int isSelfDividing(int num) {
    int temp = num;
    while (temp > 0) {
        int digit = temp % 10; // 获取数字的每一位数
        if (digit == 0 || num % digit != 0) {
            return 0; // 数字包含0或者不能整除某一位数,不是自除数
        }
        temp /= 10; // 继续检查下一位数
    }
    return 1; // 是自除数
}

int* selfDividingNumbers(int left, int right, int* returnSize) {
    int counter = 0;
    for (int i = left; i <= right; i++) {
        if (isSelfDividing(i)) {
            counter++;
        }
    }

    int* result = (int*)malloc(counter * sizeof(int));
    counter = 0;
    for (int i = left; i <= right; i++) {
        if (isSelfDividing(i)) {
            result[counter++] = i;
        }
    }

    *returnSize = counter;
    return result;
}

题目二

题目描述

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

例子:输入:[1,2,3,4]
输出:[24,12,8,6]
思路

首先,初始化一个结果数组,并将第一个元素置为 1。然后,遍历数组,计算每个元素左侧的乘积并保存在结果数组中。接下来,使用一个变量 rightProduct 来计算右侧乘积,并累乘到结果数组中。最后,返回结果数组。

int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    int* result = (int*)malloc(numsSize * sizeof(int));

    // 计算左侧乘积
    result[0] = 1;
    for (int i = 1; i < numsSize; i++) {
        result[i] = result[i-1] * nums[i-1];
    }

    // 计算右侧乘积并累乘到结果中
    int rightProduct = 1;
    for (int i = numsSize-1; i >= 0; i--) {
        result[i] *= rightProduct;
        rightProduct *= nums[i];
    }

    *returnSize = numsSize;
    return result;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值