标签:ons using span false while 控制 for 思维 改变
这个问题叫做质因子分解,花了大概两个小时写对了。这道题细节挺多的,书上提到了几点,有一个很容易错的点就是n一开始要先用一个变量保存起来,不保存的话后面有点麻烦,所以建议还是先保存起来。因为过程中要不断的改变n,最后还要打印出n,如果n为1的话还要特殊处理。当然也可以一开始处理打印,不过我觉得和思维颠倒有些难受。一个很重要的问题就是打印的素数表需要多大,这个我也不清楚怎么办,所以先写出来看,随机应变,如果不能完全覆盖的话再往上加,最后完全覆盖了那个样例。最后解决的细节是当我输入2的时候一开始只探测到根号2导致问题没有解。其实根本没必要,因为有break来控制着for循环的结束条件。所以i<num的所有数字都正常输出就好。
一个很重要的思想就是设计结构体以及结构体数组,这个思想还是挺重要的。
#include<cstdio> #include<math.h> const int maxn = 19999900; using namespace std; struct factor { int x; int cnt = 0; }fac[10]; int num = 0; bool p[10005] = { 0 }; int prime[100005]; void findprime()//获取素数表 { int i, j; for (i = 2; i *i< maxn; i++) { if (p[i] == false) { prime[num] = i; num++; for (j = i + i; j *j < maxn; j += i) { p[j] = true; } } } } int main() { int n; int temp; scanf("%d", &n); temp = n; findprime(); int i; int sum = 0; for (i = 0; i<num; i++) { int x = n; while (n % prime[i] == 0) { n /= prime[i]; fac[sum].x = prime[i]; fac[sum].cnt++; } if (x%prime[i] == 0) { sum++; } if (n == 1) break; } if (n != 1) { fac[sum].x = n; fac[sum].cnt = 1; } printf("%d=", temp); if (temp == 1) { printf("1\n"); } else for (i = 0; i < sum; i++) { if (i != sum - 1 && fac[i].cnt > 1)//不是最后一个 { printf("%d^%d*", fac[i].x, fac[i].cnt); } else if (i != sum - 1 && fac[i].cnt == 1) { printf("%d*", fac[i].x); } else if (i == sum - 1 && fac[i].cnt == 1)//是最后一个且cnt只有一个 { printf("%d\n", fac[i].x); } else//最后一个cnt有两个 printf("%d^%d\n", fac[i].x, fac[i].cnt); } }
标签:ons using span false while 控制 for 思维 改变
原文地址:https://www.cnblogs.com/legendcong/p/10540452.html