数的分解
时间限制:1000 ms | 内存限制:65535 KB
难度:1
- 描述
-
你的任务是找到一个最小的正整数Q,使Q的各位数的乘积等于N。
- 输入
- 最多450组测试数据。数据以EOF结尾。
输入一个整数N(0 ≤ N ≤ 400)。 - 输出
- 输出Q,如果Q不存在则输出−1。
- 样例输入
-
10 5
- 样例输出
-
25 5
- 来源
- ural
1 #include<stdio.h> 2 #include<iostream> 3 4 using namespace std; 5 6 int main(){ 7 int n; 8 while(scanf("%d",&n)!=EOF){ 9 10 int i = 0,ge,shi,bai,qi; 11 for(;i <= 10000 && n;i++){ 12 if(i < 10){ 13 if(i == n) 14 break; 15 } 16 else if(i < 100){ 17 ge = i % 10; 18 shi = i / 10; 19 if(ge * shi == n) 20 break; 21 } 22 else if(i < 1000){ 23 ge = i % 10; 24 shi = (i / 10)%10; 25 bai = i / 100; 26 if(ge * shi * bai == n) 27 break; 28 } 29 else { 30 ge = i % 10; 31 shi = (i / 10)%10; 32 bai = (i / 100)%10; 33 qi = i / 1000; 34 if(ge * shi * bai * qi== n) 35 break; 36 } 37 } 38 if(i==10001) 39 cout<<-1<<endl; 40 else if(n==0) 41 cout<<10<<endl; 42 else 43 cout<<i<<endl; 44 } 45 46 return 0; 47 }
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 int res[10]; 8 9 int main() 10 { 11 int n; 12 while(scanf("%d", &n) != EOF) 13 { 14 memset(res, 0, sizeof(res)); 15 if(n == 0) 16 {printf("10 "); continue;} //易错 17 else if(n < 10) 18 {printf("%d ", n); continue;} 19 else 20 { 21 int tmp = n; 22 for(int i = 9; i >= 2; ) // 统计2-9的因子个数(倒序是关键~) 23 { 24 if(tmp % i == 0) 25 { 26 res[i]++; 27 tmp /= i; 28 } 29 else 30 i--; 31 } 32 if(tmp > 10) {printf("-1 "); continue;} 33 for(int i = 2; i <= 9; ++i) //从小到大输出每个因子即可 34 for(int j = 1; j <= res[i]; ++j) 35 printf("%d", i); 36 printf(" "); 37 } 38 } 39 return 0; 40 }
第二种方法比较普遍
如果一个数 N (0<=N<=1000000000),那么就要用第二种方法