描述
给定两个整数 left
和 right
,返回一个列表,列表的元素是范围 [left, right]
内所有的 自除数。
1 <= left <= right <= 104
自除数 是指可以被它包含的每一位数整除的数,自除数 不允许包含 0 。例如,128
是一个 自除数 ,因为 128 % 1 == 0
,128 % 2 == 0
,128 % 8 == 0。
示例1
输入:left = 1, right = 22 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
示例2
输入:left = 47, right = 85 输出:[48,55,66,77]
由于被判断的数不确定有是一个几位数,需用while判断,而判断自除数需要用取余运算判断每一位是否为0且这个数能否整除这个位数,。可以自定义一个函数,对边界中的每一个数进行判断是否为自除数,再自定义一个函数将自除数存放在数组中并返回。
#include<stdio.h>
#include<stdlib.h>
#include <stdbool.h>
#include "text.h"
//判断是否为自除数
bool isSelfDividing(int num)
{
int a = num;
while (a > 0)
{
int b = a % 10;
if (b == 0 || num % b != 0)
{
return false;
}
a = a / 10;
}
return true;
}
//存边界内的自除数
int* selfDividingNumbers(int left, int right, int* returnSize) {
//动态分配内存空间
int* p = (int*)malloc(sizeof(int) * (right - left + 1));
int pos = 0;
for (int i = left; i <= right; i++)
{
if (isSelfDividing(i))
p[pos++] = i;
}
*returnSize = pos;
return p;
}int main()
{
//输入边界
int left, right;
scanf("%d%d", &left, &right);
//自除数个数
int Size=0;
//自除数数组
int* p = selfDividingNumbers(left,right,&Size);
for (int i = 0; i < Size; i++)
{
printf("%d\n", *(p + i));
}
}