关于回文素数判断的优化问题

おしまい。 2019-04-27 06:10:46
请大佬们看看回文素数的判断还能做的更好吗? 本人是纯小白一枚,第一次发贴,希望能多给点意见,谢谢各位大佬。
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongshou 2019-04-28
  • 打赏
  • 举报
回复
引用 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数的判断。


tongshou 2019-04-28
  • 打赏
  • 举报
回复









[/quote]

但是你是否考虑到编译器会优化这个操作?不保证每个编译器都做优化,但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下[/quote]

引用 8 楼 自信男孩 的回复:
[quote=引用 3 楼 tongshou 的回复:]
[quote=引用 2 楼 Italink 的回复:]
输入有问题,回文判断也有问题,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++与众不同的地方!



自信男孩 2019-04-28
  • 打赏
  • 举报
回复
引用 3 楼 tongshou 的回复:
[quote=引用 2 楼 Italink 的回复:]
输入有问题,回文判断也有问题,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]

但是你是否考虑到编译器会优化这个操作?不保证每个编译器都做优化,但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下
636f6c696e 2019-04-28
  • 打赏
  • 举报
回复
最快的素数判断算法就是建立素数表~
lin5161678 2019-04-27
  • 打赏
  • 举报
回复
判断素数不要用sqrt
精度低 强制转换到int 误差大
并且慢
可以考虑用 i*i<=n 代替 i<=sqrt(n)

lin5161678 2019-04-27
  • 打赏
  • 举报
回复
引用 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
Italink 2019-04-27
  • 打赏
  • 举报
回复
引用 3 楼 tongshou 的回复:
[quote=引用 2 楼 Italink 的回复:] 输入有问题,回文判断也有问题,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] 记住了,下次一定注意
tongshou 2019-04-27
  • 打赏
  • 举报
回复
引用 2 楼 Italink 的回复:
输入有问题,回文判断也有问题,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倍!

编程不要为了简化句子 而不考虑运行效率问题。












Italink 2019-04-27
  • 打赏
  • 举报
回复
输入有问题,回文判断也有问题,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;
}
tongshou 2019-04-27
  • 打赏
  • 举报
回复


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;
}




这个应该是比较优化的判断素数的函数

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧