这是我的代码
#include<stdio.h>
unsigned int isp(unsigned int k,unsigned int n)
{
unsigned int i;
for (i = 2; k > i && k % i == 0; i++)
return 0;
if ((k * k) <= n && n % k == 0)
return 0;
else
return 1;
}
unsigned int funB(unsigned int n)
{
unsigned int k, t;
printf("%d", n);
for (k = 3; k <= n - k; k += 2)
{
t = isp(k, n - k);
if (t == 1)
printf("=%u+%u", k, n - k);
}
return 0;
}
int main()
{
unsigned int n;
printf("输入大于2的偶数:");
scanf("%u", &n);
funB(n);
return 0;}
但是运行效果不对
k=15明显是错的,但是又改不对,怎么办呢?大家有什么好方法吗?
顺带一提请不要使用chatgpt回答,我学习的层级太低,看不懂chatgpt的回答,很多专业词汇还没有学到,望请包容( 人
```
``` )
老老实实用普通方法写吧
bool is_prime(unsigned int n) {
if (n <= 1) {
return 0;
}
for (unsigned int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
把判读两个数是否为素数的函数isp()修改下应该就可以了。
修改如下:
参考链接:
#include<stdio.h>
unsigned int isp(unsigned int k,unsigned int n)
{
unsigned int i;
// 用于判断k是否不为素数,如果k可以整除2到k-1之间的任意一个数,则不是素数,返回 0
for (i = 2; i<k ; i++){
if(k%i==0){
return 0;
}
}
// 同上, 用于判断k是否不为素数,如果k可以整除2到k-1之间的任意一个数,则不是素数,返回 0
for (i = 2; i<n ; i++){
if(n%i==0){
return 0;
}
}
// 经过上面两步,执行到这一步,说明k和n都是素数,返回1
return 1;
}
// https://baike.baidu.com/item/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3/72364
// https://blog.csdn.net/weixin_45891756/article/details/104434926
unsigned int funB(unsigned int n)
{
unsigned int k, t;
printf("%d", n);
for (k = 3; k <= n - k; k += 2)
{
t = isp(k, n - k);
if (t == 1)
printf("=%u+%u", k, n - k);
}
return 0;
}
int main()
{
unsigned int n;
printf("输入大于2的偶数:");
scanf("%u", &n);
funB(n);
return 0;}
你这个问题主要出在isp()函数上,你可以在里面打断点查看一下,当k=15时两个if都不满足,所以返回了true认为是素数
我们可以修改下isp(),先写一种最简单的,就是两个循环,每个分别判断k和n是不是素数,判断方法就是编译相除看能不能整除,整体代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
unsigned int isp(unsigned int k, unsigned int n)
{
unsigned int i= 0;
for (i = 2; i < k; i++) {
if (k % i == 0) {
return 0;
}
}
for (i = 2; i < n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
unsigned int funB(unsigned int n)
{
unsigned int k, t;
printf("%d", n);
for (k = 3; k <= n - k; k += 2)
{
t = isp(k, n - k);
if (t == 1)
printf("=%u+%u", k, n - k);
}
return 0;
}
int main()
{
unsigned int n;
printf("输入大于2的偶数:");
scanf("%u", &n);
funB(n);
return 0;
}
再来分析下代码时间复杂度,整体为一层循环,时间复杂度为0(n),基本还是可以的