码迷,mamicode.com
首页 > 其他好文 > 详细

小测最后一题的连续因子的解题报告

时间:2021-04-13 12:17:35      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:整数   一个   平方根   return   div   枚举   rgb   开始   考试   

7-84 连续因子 (20 分)
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 567 就是 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!