习题 12:因子分解★
输入n(1 <= n <= 1e9),有多组测试数据:
616
27
输出:
616 = 2^3 * 7 * 11
27 = 3^3
(注意输出空格,但行末不要有空格)
难度:for beginner
来源:http://www.yzfy.org/dis/listpost.php?tid=6&extra=page%3D1
输入n(1 <= n <= 1e9),有多组测试数据:
616
27
输出:
616 = 2^3 * 7 * 11
27 = 3^3
(注意输出空格,但行末不要有空格)
难度:for beginner
来源:http://www.yzfy.org/dis/listpost.php?tid=6&extra=page%3D1
tips:先得到一个数N,M = N开平方。用N除以2到M。可整除,得到的就是一个因子。把N除以上面的因子后再进行上面的一步。直到无法整除,则此时它为质数了。把这些值相加就OK了。
// 12.cpp : Defines the entry point for the console application. // #define PB_ID 12 #define CP_VC6 #include "stdafx.h" #include "math.h" #include "stdio.h" #include "time.h" int factor[100]; int pos; int next( int n) { int i, flag; flag = 0; for (i=2; i<=sqrt(n); i++) { if( n%i == 0) {flag =1; break;} } if(flag == 0) { factor[pos++] = n; return 1; } else { factor[pos++] = i; return n/i; } } void divide(int n) { int q; if(n >=2) { q = next(n); divide(q); } } int main(int argc, char* argv[]) { int n, i, tmp, result; long first, end; result = 1; while( scanf("%d",&n) != EOF) { first = clock(); if(n == 1) { printf("1 = 1\n"); end = clock(); printf("run time is %f s\n",(double)((end-first)/(double)CLOCKS_PER_SEC)); } else { printf("%d =",n); divide(n); factor[pos] = 0; //flag for (i=0; i<pos; i++) { tmp = factor[i]; if(tmp == factor[i+1] ) { result++; continue; } else { printf(" %d", factor[i]); if(result != 1 ) { printf("^%d",result); } if(i != pos-1) printf(" *"); result = 1; } } pos = 0; printf("\n"); end = clock(); printf("run time is %f s\n",(double)((end-first)/(double)CLOCKS_PER_SEC)); } } return 0; }