网站开发的基本流程图,国外网站在国内做镜像站点,网站开发人员 生活,做网站需要什么技术记录算法究极无敌菜菜菜鸟的垃圾思维 题目#xff1a; 现给定任意正整数 n#xff0c;请寻找并输出最小的正整数 m#xff08;m9#xff09;#xff0c;使得 m 的各位#xff08;个位、十位、百位 … …#xff09;之乘积等于n#xff0c;若不存在则输出 -1。 菜鸟… 记录算法究极无敌菜菜菜鸟的垃圾思维 题目 现给定任意正整数 n请寻找并输出最小的正整数 mm9使得 m 的各位个位、十位、百位 … …之乘积等于n若不存在则输出 -1。 菜鸟思维Recording【30分钟左右】 大学四年没碰过算法小学生思维勿喷勿喷 最开始我想使用查找表的方式先将所有结果都记录在一个table中然后后续根据index去查找答案。
#includestdio.h
#includelimits.h#define MAX 10000
int table[MAX];
/**
* 构造查找表
*/
void createTable(){int i, temp, multi;//初始化全局变量为最大值否则默认为0for(i 0; i MAX; i){table[i] INT_MAX;}i 0;while(iMAX){multi 1;temp i;while(temp 0){multi multi*(temp%10);temp temp/10;}if(table[multi] i){table[multi] i;}i;}
}/*param input:输入字符串序列return int:返回正确的结果
*/
int func(char* input) {createTable();// Please fill this blank//将char*转换为intint num 0, i 0;while(input[i] ! \0){num num*10input[i] -0;i;}return table[num];
}int main() {char str[100];printf(请输入一个字符串\n);scanf(%s, str);printf(%d, func(str));return 0;
}分析
题目并没有说明输入的字符的最大数量在我的代码里人为定义了MAX会造成内存溢出的问题ERRcreateTable的成本太高太高太高。内层while次数取决于位数可以近似等于log(i)。所以总的时间复杂度应该是O(nlog(n))
参考题解 因为限制了最小正整数m9所以对于小于10的数返回结果应该是10num对于大于等于10的数高位越小那么得到的数字肯定越小结果其实就是这个整数的因子的一个组合要得到最小的组合的整数那么低位就应该尽可能的取大值这样才能保证高位得到的是最小的。如果没有余数就表示这个数是有结果的有余数就表示这个数不存在。 #include stdio.h
int func(char* input){
//将str转换为intint i 0, num 0, res 0, pos 1;while(input[i]!\0){num num*10 input[i]-0;i;}if(num 10) return (10num);for(i 9; i 1; i--){while(num% i 0){//pos表示位数res i*pos;pos * 10;num/i;}}if(num 1) return -1;else return res;
}int main() {char str[1000];printf(请输入一个字符串\n);scanf(%s, str);printf(%d, func(str));return 0;
}分析
时间复杂度应该是O(log(n))因为这里char转换为整型也存在可能内存溢出的情况但是没有上面的严重。