C语言实现求解 最复杂的数
先上题目:
把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。
例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的。
如图:
先看这道题,就是说给你一个数,要把1到这个数之间所有数的数的约数个数求出来,再进行比较,选出最大的那个数,当然这个数就是题目中的约数的数量 :
,那我们还有
这个数没求,这个数就是刚刚求出最大约数对应的那个数。
这里没看懂的话要多看看。把题目吃透再往下进行!
不多说了,直接上代码:
#include<stdio.h>
#include <math.h>
int yue(int n){ //此函数能求出一个数的约束个数
int i;
int m;
int num;
num = 0;
m = sqrt(n);
for (i=2; i<=m; ++i){
if (n % i == 0){
num += 2;
if (i * i == n){
--num;
}
}
}
if (n != 1){
num += 2;
}else{
++num;
}
return num;
}
int main(){
int i,j,u;//循环时候的变量
int T; //表示有多少个数要进行计算
int test; //这个变量是为了从1加到给定的数,方便把之间的每个数的约数都求出来
scanf("%d",&T); //输入T
//因为输入输出格式要求,将它存在数组中,数组的声明
int a[T];
int yueshu[T];
int small[T];
for(u=0;u<T;u++){ //输入T个数
scanf("%d",&a[u]);
yueshu[u]=1; //把他赋值一下,因为下面要进行比较大小,实际意义不大
}
for(u=0;u<T;u++){ //通过这个循环,获得复杂程度最高的数约数个数
for(test=1;test<=a[u];test++) {
int m=0; //初始一下约束个数
m=yue(test);
if(m>yueshu[u]){ //进行比较,取复杂程度最高的数的约数的数量
yueshu[u]=m;
}
}
}
for(u=0;u<T;u++){ //通过这个循环,获得复杂程度最高的数
for(test=1;test<=a[u];test++) {
int m=0;
m=yue(test);
if(yueshu[u]==m){
small[u]=test;//把test值存入数组
break; //符合条件跳出这个循环,得到含有最多公约数的最小的数
}
}
}
for(u=0;u<T;u++){
printf("%d %d\n",small[u],yueshu[u]); //按照标准打印输出
}
}
现在来解释一下函数部分yue(int n):
(之前我在写求一个数的约数,我用了两个for循环嵌套,算比较大的数的约数时太费时间。)这个算法比较巧妙,对于这个问题我们只需要暴力从2到根号n这个闭区间的所有整数就行了!!
接下来就是主函数部分,要说的是注意数组的使用,声明数组时,因为我们这个数组含有参数T,那么数组的长度就是个变量,注意!!如果在声明时初始化数组,比如 int a[T]={1},这样在有的编译器中是不允许的。
具体理解卸载了函数后面,还是比较容易理解的,加油!!!
结果:
运行速度还是比较不错的