实现一个十进制数字报数程序,请按照数字从小到大的顺序返回一个整数数列,该数列从数字 1
开始,到最大的正整数 cnt
位数字结束。
示例 1:
输入:cnt = 2 输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]
知识点:
calloc
是 C 语言标准库中的一个函数,用于动态地分配内存空间,并将该内存空间初始化为零。它在使用动态内存分配时非常有用,特别是当需要确保分配的内存块的每个字节都是零时。
calloc
的函数原型如下:
void *calloc(size_t num_elements, size_t element_size);
参数解释:
-
num_elements
:要分配的元素数量。
element_size
:每个元素的大小(以字节为单位)。
atoi
是 C 语言标准库中的一个函数,用于将字符串转换为整数。函数名称 atoi
代表 "ASCII to Integer",它将字符串中的数字字符转换为对应的整数。
字符串实现大数输出
索引index从0开始,字符串长度小于n,
//回溯
void DFS(char** nums,char* str,int end,int index,int* returnSize)
{
if(index==end)
{
nums[(*returnSize)] = malloc(sizeof(char)*(end+1));
//去零,此处需要判断是否全为0,把多余的0去掉
while(str[0]=='0')str++;
//非0的部分加入。
if(str[0]!=0)strcpy(nums[(*returnSize)++],str);
return;
}
for(int i=0;i<=9;i++)
{
str[index] = i+'0';
//必须有结束符,不然strcpy越界
str[index+1] = '\0';
DFS(nums,str,end,index+1,returnSize);
}
}
int* countNumbers(int cnt, int* returnSize){
* returnSize = 0;
int* nums_c = calloc(pow(10,cnt),sizeof(int));
char** nums = malloc(sizeof(char*)*(pow(10,cnt)+1));
char* str = malloc(sizeof(char)*(cnt+1));
DFS(nums,str,cnt,0,returnSize);
//字符串转化
for(int i=0;i<*returnSize;i++)
{
nums_c[i] = atoi(nums[i]);
}
return nums_c;
}
使用递归的思想,依次构建个位、十位、百位……