C语言教材练习题 求解答

我的代码应该怎么修改
本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:
10 31
输出样例:
7 143

#include <stdio.h>
#include <math.h>
int main(){
    int m,n,i,count=0,sum=0,flag=0;
    scanf("%d %d",&m,&n);
    for(m;m<=n;m++){
        for(i=2;i<=sqrt(m)+1;i++){
            if(m%i==0){
                count++;
                sum+=m;
            }
            break;
        }
    }
    printf("%d %d",count,sum);
    return 0;
    
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

判断素数的逻辑错误了,代码修改如下:

#include <stdio.h>
#include <math.h>
int main(){
    int m,n,i,count=0,sum=0,flag=0;
    scanf("%d %d",&m,&n);
    for(m;m<=n;m++){
        for(i=2;i<=sqrt((double)m)+1;i++){
            if(m%i==0) //m%i==0,说明不是素数
                break;
        }
        if(i>sqrt((double)m))
        {
            count++;
            sum+=m;
        }
    }
    printf("%d %d",count,sum);
    return 0;

}


运行结果如下:

img


如有帮助,望采纳,谢谢。

img

你题目的解答代码如下:

#include <stdio.h>
#include <math.h>
int main(){
    int m,n,i,count=0,sum=0,flag=0;
    scanf("%d %d",&m,&n);
    if (m<=1)  //1 不是素数,m要从2开始循环
        m=2;
    for(m;m<=n;m++){
        flag=0;  //每次循环前flag设置为0
        for(i=2;i<=(int)(sqrt(m)+0.5);i++){ //不要+1 ,当m为2时 sqrt(m)返回1.41, 1.41+1大于等于2了,i会循环到2,m能被2整除, 结果2判断不是素数了     
            if(m%i==0){
                flag=1;  //能被整除就不是素数,flag设置为1表示m是不素数
                break;
            }
        }
        if(flag==0){  //循环之后再判断能flag是不是为0,是0表示, 循环中m没有被整除 m是素数6
            count++;
            sum+=m;
        }
    }
    printf("%d %d",count,sum);
    return 0;

}

img

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

一些细节上的处理错误,改正如下:

#include <stdio.h>
#include <math.h>
int main(){
    int m,n,i,count=0,sum=0;//flag没用到 删去
    scanf("%d %d",&m,&n);
    for(m=m;m<=n;m++)  //m改为m=m
    {
        for(i=2;i<=sqrt(m)+1;i++)
        {
            if(m%i==0)
                break;
        }
        if(i>sqrt(m))//进一步筛选判断
        {
            count++;
            sum+=m;
        }
    }
    printf("%d %d",count,sum);
    return 0;
 
}
 
 

运行结果如图:

img

以上仅供参考,如有任何疑问,可以评论回复,看到即回。
希望对题主有所帮助!可以的话,点个采纳!

#include <stdio.h>
#include <math.h>
int main() {
    int m, n, i, count = 0, sum = 0, flag = 0;
    //flag在这种判断素数的方法中不需要
    scanf("%d %d", &m, &n);
    /*if (m <= 0 || m == 1)
        m = 2;
    else if (m > n)
        return 0;
    if (m == 2)
        sum += 2;*/
    //上面这一段注释掉的代码保证了区间下限 m小于等于0 以及 m等于1 或 下限m大于上限n 时都能够正常运行
    for (m; m <= n; m++) 
    {//for语句可以改成  for (; m <= n; m++) 
        for (i = 2; i <= (int)sqrt(m) + 1; i++) 
        {//sqrt()函数的返回值为浮点数,强制转换为int类型
            if (m%i == 0)
                break;
        }
        if (i > (int)sqrt(m) + 1)
        {
            count++;
            sum += m;
            printf("%d\n", m);
            //去掉注释符号可以打印该区间的素数
        }
    }
    printf("%d %d", count, sum);
    return 0;
}

代码里已写了注释,望细看