当前位置: 首页 > article >正文

C/C++ 实现由用户通过键盘输入自然数并判断其是不是素数(带清空缓冲区等考虑)

由键盘输入一个自然数并判断其是不是素数是一个老生常谈的话题了。对新手程序员而言,这个题目估计也是一道必做题。这里分享一个 C 语言风格和一个 C++ 风格的代码,仅提供参考和交流,不适合新生直接复制去交作业

与常规代码(指一般用于新生交作业的以 sqrt(n) 作为循环中止条件的代码)的不同:

  1. 使用循环,在 C++ 中用 for (;;) 进行无条件死循环;
  2. 每次接收输入前清空缓冲区(不适合 ACM 场景)防止残留的键盘缓冲区影响下一次输入甚至造成不明原因的死循环;
  3. C 语言:使用 scanf_s 而非 scanf,因为更加安全,且 scanf_s 返回 1 可以指示输入成功,避免在需要接收一个数字类型的时候受到非数字字符的干扰或甚至造成不明原因的死循环;
  4. C++:手动判断字符串是否为纯数字字符且是否越出 unsigned long long int 的承受范围,相比于这里提供的 C 语言风格代码更友好。

C 语言风格:

#include<stdio.h>
#include<math.h>

static bool isPrime(int n)
{
	for (int i = 2; i <= sqrt(n); ++i)
		if (0 == n % i)
			return false;
	return true;
}

int main()
{
	int n = 2;
	rewind(stdin);
	fflush(stdin);
	printf("请输入一个正整数:");
	while (scanf_s("%d", &n) == 1)
	{
		if (n <= 0)
			printf("%d 小于等于 0,本程序仅支持正整数。\n", n);
		else if (1 == n)
			printf("%d 既不是素数也不是合数。\n", n);
		else if (isPrime(n))
			printf("%d 是素数。\n", n);
		else
			printf("%d 不是素数。\n", n);
		rewind(stdin);
		fflush(stdin);
		printf("请输入一个正整数:");
	}
	printf("检测到非数字字符,程序退出。\n\n");
	return 0;
}

C++ 风格:

#include<iostream>
#include<string>
using namespace std;

static bool isDigit(const string& s)
{
	for (size_t i = 0; i < s.length(); ++i)
		if (s[i] < '0' || s[i] > '9')
			return false;
	return true;
}

static bool isPrime(unsigned long long int n)
{
	for (unsigned long long int i = 2; i <= sqrt(n); ++i)
		if (0 == n % i)
			return false;
	return true;
}

int main()
{
	for (;;)
	{
		cout << "请输入一个正整数:";
		rewind(stdin);
		fflush(stdin);
		string s = "";
		getline(cin, s);
		if ((s.length() <= 19 || s.length() == 20 && s.compare("18446744073709551615") <= 0) && isDigit(s))
		{
			const unsigned long long int n = stoull(s);
			if (n <= 1)
				cout << n << " 既不是素数也不是合数。" << endl << endl;
			else if (isPrime(n))
				cout << n << " 是素数。" << endl << endl;
			else
				cout << n << " 不是素数。" << endl << endl;
		}
		else
			break;
	}
	cout << "检测到非数字字符或输入的不是小于等于 18446744073709551615 的自然数,程序退出。" << endl << endl;
	return EXIT_SUCCESS;
}

效果图


http://www.kler.cn/a/576021.html

相关文章:

  • 解决ubuntu18.04系统更新的问题
  • 风虎云龙R87与RH87八卡服务器震撼首发
  • 《白帽子讲 Web 安全》之文件操作安全
  • RV1126+FFMPEG多路码流监控项目
  • 【FSM-3: 串行序列】
  • NVIC原理和使用
  • 【免费】2000.1-2021.9上市公司仲裁数据
  • Java数据结构第十八期:探索优先级队列的魅力(二)
  • 论文阅读:基于超图高阶表示的WSI生存预测
  • 前端分页技术的深度解析与实践优化
  • 通过着装人体剪影预测关键点,以获取人体的二维尺寸数据。复现过程包括获取或生成3D人体数据集、生成轮廓图像、训练模型等步骤
  • 测试直播postman+Jenkins所学
  • 网络原理之HTTPS(如果想知道网络原理中有关HTTPS的知识,那么只看这一篇就足够了!)
  • 仕考网:事业单位结构化面试技巧
  • 深入理解Tomcat的Request复用机制及其风险
  • 天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】
  • Rocky linux 安装 docker
  • 请谈谈 HTTP 中的缓存控制,如何使用 Cache-Control 和 ETag 进行缓存管理?
  • 嵌入式仿真实验教学平台替换Proteus,嵌入式教学创新的新选择
  • Facebook 与信息传播:塑造新闻和媒体的新生态