题目一
:
题目描述
自除数 是指可以被它包含的每一位数整除的数。 例如,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;
}