因子分解

输入n(1 <= n <= 1e9),有多组测试数据:
616
27

输出:
616 = 2^3 * 7 * 11
27 = 3^3
(注意输出空格,但行末不要有空格)

题目转自 http://yzfy.org

第一次:

 

#include < stdio.h >
#include
< math.h >
int  main()
{
    
long   int  num;
    
int  n,i;
    
while (scanf( " %ld " , & num) != EOF){
        
int  count = 0 ,flag = 0 ;
        printf(
" %ld =  " ,num);
        n
= sqrt(num);
        
for (i = 2 ;i <= n;count = 0 ,i ++ ){
            
while (num % i == 0 ){
                count
++ ;
                num
/= i;
            }
            
if (count != 0 ){
                n
= sqrt(num);
                
if (flag == 0 ){
                    flag
++ ;
                    printf(
" %d " ,i);
                    
if (count > 1 )
                        printf(
" ^%d " ,count);
                }
                
else {
                    printf(
"  * %d " ,i);
                    
if (count > 1 )
                        printf(
" ^%d " ,count);
                }
            }
            
        }
        
if (flag == 0 )
            printf(
" %d " ,num);
        
else
            
if (num != 1 )
                printf(
"  * %d " ,num);
        printf(
" " );
    }
    
return   0 ;
}

OJ给的结果:

Name: " bysdy" Problem ID " 12"
Submit Time: 2008/2/02-15:37

G++: Compile Warning:
Line  In function `int main()':
Line 11: warning: converting to `int' from `double'
Line 18: warning: converting to `int' from `double'
Line 34: warning: int format, long int arg (arg 2)
Line 37: warning: int format, long int arg (arg 2)

Test  1:    Accepted    Time = 121 ms
Test  2:    Accepted    Time = 31 ms
Test  3:    Accepted    Time = 438 ms
Test  4:    Accepted    Time = 705 ms
Test  5:    Time Limit Exceed
--------------------------------
Problem ID     12
Test Result    Time Limit Exceed
Time Limit     10000 ms
Total Memory   32 Kb / 10000 Kb
Code Length    628 Bytes
第二次:
#include < stdio.h >
#include
< math.h >
int  main()
{
    
long   int  num;
    
int  n,i;
    
while (scanf( " %ld " , & num) != EOF){
        
int  count = 0 ,flag = 0 ;
        printf(
" %ld =  " ,num);
        n
= int (sqrt(num));
        
for (i = 2 ;i <= n;count = 0 ,i += 2 ){
            
while (num % i == 0 ){
                count
++ ;
                num
/= i;
            }
            
if (count != 0 ){
                n
= int (sqrt(num));
                
if (flag == 0 ){
                    flag
++ ;
                    printf(
" %d " ,i);
                    
if (count > 1 )
                        printf(
" ^%d " ,count);
                }
                
else {
                    printf(
"  * %d " ,i);
                    
if (count > 1 )
                        printf(
" ^%d " ,count);
                }
            }
            
if (i == 2 )
                i
= 1 ;
            
        }
        
if (flag == 0 )
            printf(
" %ld " ,num);
        
else
            
if (num != 1 )
                printf(
"  * %ld " ,num);
        printf(
" " );
    }
    
return   0 ;
}

OJ的结果:

Name: " bysdy" Problem ID " 12"
Submit Time: 2008/2/02-15:48

G++: Compile OK

Test  1:    Accepted    Time = 86 ms
Test  2:    Accepted    Time = 8 ms
Test  3:    Accepted    Time = 161 ms
Test  4:    Accepted    Time = 371 ms
Test  5:    Accepted    Time = 9564 ms
--------------------------------
Problem ID     12
Test Result    Accepted
Total Time     10190 ms
Total Memory   32 Kb / 10000 Kb
Code Length    664 Bytes
第三次:
#include < stdio.h >
#include
< math.h >
int  main()
{
    
long   int  num;
    
int  n,i,j;
    
while (scanf( " %ld " , & num) != EOF){
        
int  count = 0 ,flag = 0 ;
        printf(
" %ld =  " ,num);
        n
= int (sqrt(num));
        
for (i = 2 ,j = 1 ;i <= n;count = 0 ,i = (i <= 3 ? i + 2 :((i < 6 * j) ? ( 6 * j + 1 ):(j ++ , 6 * j - 1 )))){ // 素数至少满足6*j+1或6*j-1
             while (num % i == 0 ){
                count
++ ;
                num
/= i;
            }
            
if (count != 0 ){
                n
= int (sqrt(num));
                
if (flag == 0 ){
                    flag
++ ;
                    printf(
" %d " ,i);
                    
if (count > 1 )
                        printf(
" ^%d " ,count);
                }
                
else {
                    printf(
"  * %d " ,i);
                    
if (count > 1 )
                        printf(
" ^%d " ,count);
                }
            }
            
if (i == 2 )
                i
= 1 ;
            
        }
        
if (flag == 0 )
            printf(
" %ld " ,num);
        
else
            
if (num != 1 )
                printf(
"  * %ld " ,num);
        printf(
" " );
    }
    
return   0 ;
}

OJ的结果:

Name: " bysdy" Problem ID " 12"
Submit Time: 2008/2/02-16:12

G++: Compile OK

Test  1:    Accepted    Time = 87 ms
Test  2:    Accepted    Time = 6 ms
Test  3:    Accepted    Time = 115 ms
Test  4:    Accepted    Time = 266 ms
Test  5:    Accepted    Time = 6508 ms
--------------------------------
Problem ID     12
Test Result    Accepted
Total Time     6982 ms
Total Memory   32 Kb / 10000 Kb
Code Length    708 Bytes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值