user-0 提问: 关于回文素数判断的优化问题

回复:
user: user-1
content: 引用 5 楼 lin5161678 的回复:[quote=引用 1 楼 tongshou 的回复:]   BOOL isPrimeNo (int x) {     int  t= 2+ (int) sqrt(x);     int  k;      for (k=2; k < t; ++k) {         if (x % k == 0) {             return FALSE;         }     }      return TRUE; }     这个应该是比较优化的判断素数的函数看不懂你的操作 这样判断 2 不是素数了? 另外C/C++没有BOOL/TRUE/FALSE[/quote]  抱歉，您说得很对。该函数仅适用  >=3 的， 漏了 0-2数的判断。

user: user-1
content: [/quote]  但是你是否考虑到编译器会优化这个操作？不保证每个编译器都做优化，但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下[/quote]  引用 8 楼 自信男孩 的回复:[quote=引用 3 楼 tongshou 的回复:] [quote=引用 2 楼 user-5 的回复:] 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。  [/quote]  但是你是否考虑到编译器会优化这个操作？不保证每个编译器都做优化，但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下[/quote]  您也真敢想，让编译器优化是有时间代价的。要明确判断编译器是否优化不是一件容易、确定的事，能够依靠自己的，千万不要依靠他人，更不要迷信系统会做得更好（这方面本人有很深刻的体会），在很多具体、精细问题上，C/C++提供机会让 程序员可以比系统做得更好，这就是C/C++与众不同的地方！

user: user-2
content: 引用 3 楼 tongshou 的回复:[quote=引用 2 楼 user-5 的回复:] 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。             [/quote]  但是你是否考虑到编译器会优化这个操作？不保证每个编译器都做优化，但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下

user: user-3
content: 最快的素数判断算法就是建立素数表~

user: user-4
content: 判断素数不要用sqrt 精度低 强制转换到int 误差大 并且慢 可以考虑用 i*i<=n 代替 i<=sqrt(n)

user: user-4
content: 引用 1 楼 tongshou 的回复:  BOOL isPrimeNo (int x) {     int  t= 2+ (int) sqrt(x);     int  k;      for (k=2; k < t; ++k) {         if (x % k == 0) {             return FALSE;         }     }      return TRUE; }     这个应该是比较优化的判断素数的函数看不懂你的操作 这样判断 2 不是素数了? 另外C/C++没有BOOL/TRUE/FALSE

user: user-5
content: 引用 3 楼 tongshou 的回复:[quote=引用 2 楼 user-5 的回复:] 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。   [/quote] 记住了，下次一定注意

user: user-1
content: 引用 2 楼 user-5 的回复:输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。

user: user-5
content: 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }

user: user-1
content: BOOL isPrimeNo (int x) {     int  t= 2+ (int) sqrt(x);     int  k;      for (k=2; k < t; ++k) {         if (x % k == 0) {             return FALSE;         }     }      return TRUE; }     这个应该是比较优化的判断素数的函数