user-0 提问: 学习日记三：素因子分解，撸了一个上午

回复:
user: user-1
content: 没必要循环到n, sqrt(n)就够了，比sqrt(n)大的质数约数之多只有一个。 引用 3 楼 fefe82 的回复:[quote=引用 2 楼 u010107248 的回复:] [quote=引用 1 楼 fefe82 的回复:] 随便写一下，仅供参考  void split(int n){   if (n<=1) return;   map<int, int> factors;   for (int i = 2; i <= n; i++){     while (n%i == 0) {         n = n / i;         factors[i] ++;     }   }   printf ("1");   for (auto &v: factors) {     printf("*%d^%d", v.first, v.second);   } }  没学过C++。。。。[/quote]  void split(int n){   if (n<=1) return;   printf ("1");   for (int i = 2; i <= n; i++){     int k = 0;     while (n%i == 0) {         n = n / i;         k++;     }     if ( k > 0) {         printf("*%d^%d", i, k);     }   } }[/quote]

user: user-2
content: 仅供参考：#include <iostream> using namespace std; struct MyStruct {     int Nodedata;     MyStruct *pLeft;     MyStruct *pRight; } s1,s2,s3,s4,s5,s6,s7,s8; void ashow(MyStruct * p) {     if (p != nullptr) {         ashow(p->pLeft);         ashow(p->pRight);         cout << p->Nodedata << endl;         if (p->Nodedata == 4) {             throw 1;//退出递归.直接返回.         }     } } int main() {     MyStruct *pRoot;//根      pRoot = &s1;     s1.Nodedata = 1;     s2.Nodedata = 2;     s3.Nodedata = 3;     s4.Nodedata = 4;     s5.Nodedata = 5;     s6.Nodedata = 6;     s7.Nodedata = 7;     s8.Nodedata = 8;      s1.pLeft = &s2;     s1.pRight = &s3;      s2.pLeft = &s4;     s2.pRight = &s5;      s3.pLeft = &s6;     s3.pRight = &s7;     try {         ashow(pRoot);     } catch (int err) {         cout<<"catch err "<<err<<endl;     }     return 0; } //4 //catch err 1 //

user: user-2
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-3
content: 只是返回该层，返回后会继续执行上一层

user: user-4
content: 引用 2 楼 u010107248 的回复:[quote=引用 1 楼 fefe82 的回复:] 随便写一下，仅供参考  void split(int n){   if (n<=1) return;   map<int, int> factors;   for (int i = 2; i <= n; i++){     while (n%i == 0) {         n = n / i;         factors[i] ++;     }   }   printf ("1");   for (auto &v: factors) {     printf("*%d^%d", v.first, v.second);   } }  没学过C++。。。。[/quote]  void split(int n){   if (n<=1) return;   printf ("1");   for (int i = 2; i <= n; i++){     int k = 0;     while (n%i == 0) {         n = n / i;         k++;     }     if ( k > 0) {         printf("*%d^%d", i, k);     }   } }

user: user-0
content: 引用 1 楼 fefe82 的回复:随便写一下，仅供参考  void split(int n){   if (n<=1) return;   map<int, int> factors;   for (int i = 2; i <= n; i++){     while (n%i == 0) {         n = n / i;         factors[i] ++;     }   }   printf ("1");   for (auto &v: factors) {     printf("*%d^%d", v.first, v.second);   } }  没学过C++。。。。

user: user-4
content: 随便写一下，仅供参考  void split(int n){   if (n<=1) return;   map<int, int> factors;   for (int i = 2; i <= n; i++){     while (n%i == 0) {         n = n / i;         factors[i] ++;     }   }   printf ("1");   for (auto &v: factors) {     printf("*%d^%d", v.first, v.second);   } }

user: user-0
content: 代码有了，不给

user: user-3
content: 引用 16 楼 u010107248 的回复:[quote=引用 14 楼 adlay 的回复:] [quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote]  引用 14 楼 adlay 的回复:[quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote] 我一直觉得用goto会使得代码写起来简单一些，可就是不让用[/quote]  引用 16 楼 u010107248 的回复:[quote=引用 14 楼 adlay 的回复:] [quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote]  引用 14 楼 adlay 的回复:[quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote] 我一直觉得用goto会使得代码写起来简单一些，可就是不让用[/quote]  goto通常可以用于跳出比较深的循环，其他情况能不用还是不用

user: user-0
content: 引用 14 楼 adlay 的回复:[quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote]  引用 14 楼 adlay 的回复:[quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote] 我一直觉得用goto会使得代码写起来简单一些，可就是不让用

user: user-3
content: 引用 14 楼 adlay 的回复:[quote=引用 13 楼 paschen 的回复:]  通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！[/quote]  我没说他是一种好主意，另外他是跳出递归，用goto不行

user: user-5
content: 引用 13 楼 paschen 的回复:通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出  用异常来跳出循环比用 goto 语句还恶劣 100 倍！

user: user-3
content: 引用 12 楼 u010107248 的回复:[quote=引用 11 楼 paschen 的回复:]   void f() {        if() //满足某条件             throw(xxx);       f(); }  main() {   try   {       f();   }   catch(xxx)   {   } //...............跳出之后的代码 } 不明白，能解释下么。。。[/quote]   通过异常处理，可以快速从递归跳出，当满足某种条件后就抛出异常，在外面捕捉这个异常，从而达到跳出

user: user-0
content: 引用 11 楼 paschen 的回复:void f() {        if() //满足某条件             throw(xxx);       f(); }  main() {   try   {       f();   }   catch(xxx)   {   } //...............跳出之后的代码 } 不明白，能解释下么。。。

user: user-3
content: void f() {        if() //满足某条件             throw(xxx);       f(); }  main() {   try   {       f();   }   catch(xxx)   {   } //...............跳出之后的代码 }

user: user-3
content: 引用 5 楼 u010107248 的回复:[quote=引用 4 楼 paschen 的回复:] 只是返回该层，返回后会继续执行上一层 这样的话我要怎么输出啊，我希望得到结果输出后立即停止函数运行[/quote]  这样呢  void f() {        if() //满足某条件             throw(xxx); }  main() {   try   {       f();   }   catch(xxx)   {   } }

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-0
content: 引用 7 楼 user-6 的回复:[quote=引用 5 楼 u010107248 的回复:] [quote=引用 4 楼 paschen 的回复:] 只是返回该层，返回后会继续执行上一层 这样的话我要怎么输出啊，我希望得到结果输出后立即停止函数运行[/quote] 全局变量，flag， 遇见flag==true就继续返回上层[/quote]  像这样写个，举个例子吧 void f() {        if()          {          }        else      {          f（）       } }  main() {       f(); }

user: user-6
content: 引用 5 楼 u010107248 的回复:[quote=引用 4 楼 paschen 的回复:] 只是返回该层，返回后会继续执行上一层 这样的话我要怎么输出啊，我希望得到结果输出后立即停止函数运行[/quote] 全局变量，flag， 遇见flag==true就继续返回上层

user: user-0