关于检测素数为什么会通过不了题库的测试

img

一个很基础的问题,下面是我的代码,为什么总是通过不了啊


#include
#include
using namespace std;

char tf(long long n) {
    
    for (int i = 2; i < n; i++) {
        if (n % i == 0) { return 'F'; break; }

}
    
    return 'T';
}


int main() {
    long long  n;
    cin >> n;

    cout << tf(n) << endl;



    return 0;
}

求解答谢谢!

没有考虑输入1的情况,函数增强对1的判断,直接返回'F'

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/234045
  • 这篇博客你也可以参考下:由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
  • 除此之外, 这篇博客: 扫雷游戏(递归算法进行扩展)中的 递归过后的位置下一次不需要递归,否则会使递归函数无限循环! 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 解决办法:在第一次输入排雷坐标时定义一个Contrast[ROWS][COLS]数组,当某个位置判断过后就将该位置对应的Contrast[ROWS][COLS]数组元素置为'$',下一次递归时,如果该坐标在Contrast[ROWS][COLS]数组中对应的元素为'$',则跳过递归。

    void Extend_board(char mine[ROWS][COLS], char show[ROWS][COLS],char contrast[ROWS][COLS], int x, int y)
    //非地雷且周围没有地雷的扩展函数
    {
    	if (x >= 1 && x <= ROW && y >= 1 && y <= COL && (Num(mine, x, y) == '0'))
    //Num(mine,x,y)函数返回存储地雷信息的mine数组中x y位置周围一圈(8个位置)的地雷总和
    	{
    		for (int i = x - 1; i <= x + 1; i++)  //不得超出棋盘大小
    		{
    			for (int j = y - 1; j <= y + 1; j++) //不得超出棋盘大小
    			{
    				show[i][j] = Num(mine, i, j); //将该位置一圈地雷总和信息传递到show()函数
    				if (show[i][j]=='0'&&contrast[i][j] != '$') //如果该位置不是地雷且没有被标记
    				{
    					contrast[i][j] = '$'; //将该位置标记
    					Extend_board(mine, show, contrast, i, j); //调用递归函数再次进行判断
    				}
    			}
    		}
    	}
    	return ;
    }

    难点2:判断什么时候赢

    在show[ROWS][COLS]数组中,没有排查过的位置存储的是'#'

    在玩家每次选择坐标后,如果该位置是地雷,则扫雷失败,如果不是地雷,显示数组,如果数组不是0,不需要扩展,如果是0,调用扩展函数。

    上诉程序执行后,进行一次show棋盘上‘#’数量的查找,如果棋盘上剩余的'#'数量总和与地雷总数一样,则说明扫雷成功

    R_count = 0;
    for (int i = 1; i <= ROW; i++)
    {
    	for (int j =1; j <= COL; j++)
        {
            if (show[i][j] == '#') //在show[ROWS][COLS]数组中,没有排查过的位置存储的是'#'
            {
    	        R_count++;
            }
        }
    }

    补充知识点:

    在调用随机数时需要配置随机数生成器,随机数生成器生成一次就行,可以放在主函数前部,引用头文件

    #include<stdlib.h>

    #include<time.h>

    int x = 0 ;

    srand( ( unsigned int ) time ( NULL ) ) //time()函数返回的类型为time_t

    x = rand() ; //生成随机数

    Scanf()函数在输入数据后按enter键确认,输入的数据和‘/n’会一并存入缓存区,在下一次调用scanf()函数时,‘/n’会被scanf()函数提取,应该先用getchar()函数拿掉这个字符。

  • 您还可以看一下 王西猛老师的商超收银软件中的扫码识别商品编程解析课程中的 扫描枪扫码识别解析概述小节, 巩固相关知识点

return 'F';之后的break;是多此一举
没有对<=1的情况做判断
还有,为什么是long long?如果是因为n可能很大,那么你这样的算法效率很低,会超时。
实际上无需判断到n,判断到sqrt(n)即可。

先判断n<2
i < n改为i*i<=n