标签:整数 一个 平方根 return div 枚举 rgb 开始 考试
7-84 连续因子 (20 分) 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。 输入格式: 输入在一行中给出一个正整数 N(1<N<2的31次方?? )。 输出格式: 首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。 输入样例: 630 输出样例: 3 5*6*7 作者 陈越 单位 浙江大学 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
先赋上AC代码,考试的时候没有进行判断素数的优化,两个测试点没过去。
1 #include<stdio.h> 2 #include<math.h> 3 int a[100]; 4 int isprime(int x) 5 { 6 if(x < 2)return 0; 7 for(int i = 2 ;i <= sqrt(x) ; i ++) 8 if(x%i==0)return 0; 9 return 1; 10 } 11 12 int main(void) 13 { 14 int n,max = 0; 15 scanf("%d",&n); 16 if(isprime(n))printf("1\n%d\n",n); 17 else { 18 for(int i = 2 ; i <= sqrt(n) ; i ++) 19 { 20 int x = n,cnt = 0; 21 if(n % i == 0) 22 { 23 for(int j = i ; x % j == 0 ; j ++, cnt ++)x/=j; 24 if(cnt > max){ 25 max = cnt; 26 for(int j = 0,k = i ; j < cnt ;j ++,k ++)a[j] = k; 27 } 28 } 29 } 30 for(int i = 0 ;i < max ; i ++) 31 { 32 if(!i)printf("%d\n%d",max,a[i]); 33 else printf("*%d",a[i]); 34 } 35 } 36 37 return 0; 38 }
1.先判断是不是素数,如果是素数显然无法分解成连续因子,所以只能输出他本身。
2.从2开始枚举到n的平方根,(原因与判断素数只枚举到n的平方根的原因相同),如果i是n的因子,就判断接下来有几个连续数字是n的因子。
3.如果cnt大于max,则更新max和存入的连续因子。
4.按格式输出即可。
标签:整数 一个 平方根 return div 枚举 rgb 开始 考试
原文地址:https://www.cnblogs.com/sherluoke/p/14649466.html