关于return 1 代码块放置不同,求得素数结果不同的疑问
下面是两个求素数的代码块,都是使用sqrt函数,用for循环配对,测试用例为(-1 10),但是由于return 1 放置的位置不同,导致求得结果不一样,想知道为什么,谢谢大佬。<blockquote>#include <stdio.h>这份代码结果是正常的,输出结果为Sum of ( 2 3 5 7 ) = 17但下面这串代码结果就不一样了
<blockquote>#include <stdio.h>
这份代码的结果为Sum of ( 2 3 5 7 9 ) = 26
想知道为什么,谢谢大佬 首先,你贴的代码块里没有显示完整的代码,所以我不能直接分析出原因。
但是,我可以给你一些建议来找出问题所在。
首先,两个代码块的主要区别是return 1的位置。如果return 1放置在不同的地方,
可能会导致函数在循环或条件语句中返回不同的结果。这将影响到求素数的结果。
下面是一个简单的素数检测函数的示例:
#include <stdio.h>
#include <math.h>
int is_prime(int n) {
if (n <= 1) {
return 0;
}
if (n <= 3) {
return 1;
}
if (n % 2 == 0 || n % 3 == 0) {
return 0;
}
int i = 5;
while (i * i <= n) {
if (n % i == 0 || n % (i + 2) == 0) {
return 0;
}
i += 6;
}
return 1;
}
int main() {
int sum = 0;
for (int i = -1; i <= 10; ++i) {
if (is_prime(i)) {
printf("%d ", i);
sum += i;
}
}
printf("Sum = %d\n", sum);
return 0;
}
在这个示例中,is_prime函数用于检查一个整数是否为素数。
如果你在这个函数中改变return 1的位置,可能会导致错误的结果。
建议你检查一下你的代码,确保return 1在合适的位置,并确认其他的循环和条件语句是否正确。
可以尝试用不同的测试用例来验证你的代码是否正确。如果你能提供完整的代码,我将更好地帮助你解决问题。 本帖最后由 陈落轩 于 2023-4-10 15:10 编辑
哎代码怎么没了...
重发一次,这是第一条#include <stdio.h>
#include <math.h>
int prime( int p );
int PrimeSum( int m, int n );
int main()
{
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
/* 你的代码将被嵌在这里 */
#include <stdio.h>
int prime( int p ){
int i ;
if (p < 2){
return 0;
}
if(p == 2){
return 1;
}
for(i = 2; i <= sqrt(p); i++){
if(p % i == 0){
return 0;
}else{
return 1;
}
}
}
int PrimeSum( int m, int n ){
int sum = 0;
for(; m <= n; m++){
if(prime(m)){
sum += m;
}
}
return sum;
}
isdkz 发表于 2023-4-10 15:06
首先,你贴的代码块里没有显示完整的代码,所以我不能直接分析出原因。
但是,我可以给你一些建议来找出 ...
啊啊大佬好,原本的代码好像pta网站直接拷贝会没办法显示,我重新放下
这是第一种:
int prime( int p ){
int i ;
if (p < 2){
return 0;
}
if(p == 2){
return 1;
}
for(i = 2; i <= sqrt(p); i++){
if(p % i == 0){
return 0;
}
}
return 1;
}
这是第二种:
int prime( int p ){
int i ;
if (p < 2){
return 0;
}
if(p == 2){
return 1;
}
for(i = 2; i <= sqrt(p); i++){
if(p % i == 0){
return 0;
}else{
return 1;
}
}
} 陈落轩 发表于 2023-4-10 15:16
啊啊大佬好,原本的代码好像pta网站直接拷贝会没办法显示,我重新放下
这是第一种:
第一个代码块(正确的):
int prime(int p) {
int i;
if (p < 2) {
return 0;
}
if (p == 2) {
return 1;
}
for (i = 2; i <= sqrt(p); i++) {
if (p % i == 0) {
return 0;
}
}
return 1;
}
在这个代码块中,for循环会遍历从2到sqrt(p)的所有整数。如果p可以被i整除(即p % i == 0),则说明p不是素数,函数返回0。
如果循环结束后没有发现可以整除p的整数,说明p是素数,函数返回1。
第二个代码块(错误的):
int prime(int p) {
int i;
if (p < 2) {
return 0;
}
if (p == 2) {
return 1;
}
for (i = 2; i <= sqrt(p); i++) {
if (p % i == 0) {
return 0;
} else {
return 1;
}
}
}
在这个代码块中,问题出在for循环内的else语句。在第一次迭代时,如果p不能被i整除,函数就会立即返回1,而不是继续检查其他可能的因数。
这导致了一些合数(如9)被错误地判断为素数,因为在第一次迭代(i=2)时,p % i != 0,函数就返回了1。
为了修复第二个代码块,你需要删除else语句,使其与第一个代码块一样。这样,函数才能正确地检查所有可能的因数,并在循环结束后返回正确的结果。
页:
[1]