本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。
今日练习题关键字:自除数 除自身以外数组的乘积
💓博主csdn个人主页:小小unicorn
⏩专栏分类:C语言天天练
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识
Day1
- 题目一:
- 题目描述:
- 解题思路:
- 代码实现:
- 结果情况:
- 题目二:
- 题目描述:
- 解题思路:
- 代码实现:
- 结果情况:
- 总结:
题目一:
题目描述:
题目来源:自除数
自除数 是指可以被它包含的每一位数整除的数。
例如,128 是一个 自除数 ,因为 128 % 1 == 0, 128 % 2 == 0,128 % 8 == 0。
自除数 不允许包含 0 。
给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。
解题思路:
遍历范围 [left,right] 内的所有整数,分别判断每个整数是否为自除数。
根据自除数的定义,如果一个整数不包含 0 且能被它包含的每一位数整除,则该整数是自除数。判断一个整数是否为自除数的方法是遍历整数的每一位,判断每一位数是否为 0 以及是否可以整除该整数。
遍历整数的每一位的方法是,每次将当前整数对 10取模即可得到当前整数的最后一位,然后将整数除以 10。重复该操作,直到当前整数变成 0 时即遍历了整数的每一位。
代码实现:
bool isSelfDividing(int num)
{
int temp = num;
while (temp > 0)
{
int digit = temp % 10;
if (digit == 0 || num % digit != 0)
{
return false;
}
temp /= 10;
}
return true;
}
int* selfDividingNumbers(int left, int right, int* returnSize)
{
int * ans = (int *)malloc(sizeof(int) * (right - left + 1));
int pos = 0;
for (int i = left; i <= right; i++)
{
if (isSelfDividing(i))
{
ans[pos++] = i;
}
}
*returnSize = pos;
return ans;
}
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
题目来源:除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
解题思路:
分成前缀和后缀然后相乘。
代码实现:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
int L[numsSize]; // 前缀的乘积
int R[numsSize]; // 后缀的乘积
// 前缀
L[0] = 1;
for(int i = 1; i < numsSize; i++)
{
L[i] = L[i - 1] * nums[i - 1];
}
// 后缀
R[numsSize - 1] = 1;
for(int i = numsSize - 2; i >= 0; i--)
{
R[i] = R[i + 1] * nums[i + 1];
}
int* answer = (int*)malloc(sizeof(int) * numsSize);
for(*returnSize = 0; *returnSize < numsSize; (*returnSize)++)
{
answer[*returnSize] = L[*returnSize] * R[*returnSize];
}
return answer;
}
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!