#include
using namespace std;
bool isPrime(int) ;
int main ()
{
for (int n = 2; n <=100; n++)
{
if (isPrime(n))
cout<< n << endl;
}
return 0;
}
bool isPrime(int n)
{
bool bPrime = true ;
for ( int i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
bPrime = false ;
break ;
}
}
return bPrime
}
为什么最后一行bPrime改成true,输出素数就会变成输出所有数?
该回答引用chatgpt:
在这个 C++ 代码中,isPrime 函数用于判断一个数是否为素数,main 函数中则对 2 到 100 之间的数逐个判断是否为素数并输出。
问题在于 isPrime 函数中的 bPrime 值初始为 true,如果在 for 循环中找到了某个 i 使得 n 能够被 i 整除,则 bPrime 被赋值为 false。但是在找不到任何一个 i 能够整除 n 的情况下,bPrime 的值仍然为 true。在 isPrime 函数结束后,函数返回 bPrime 的值,以供 main 函数中的输出使用。
如果将最后一行的 return bPrime 改为 return true,那么无论 n 是否为素数,isPrime 函数都会返回 true,因此在 main 函数中调用 isPrime 函数的结果总是为 true,即所有数都会被输出。
因此,应该保留 bPrime 变量并在 for 循环结束后返回其值,而不是在函数中直接返回 true。
if (isPrime(n)) //判断函数返回是不为真
cout<< n << endl;为真则输出n,你把返回改为true,无论n为什么都为真,进行输出
如果直接retrun true;那你这个方法返回的永远是true,当然是输出所有数了。现在这个写法当发现不是素数就返回false,自然也就不输出了,最后输出的也都是素数。
注:if中的break只是终止了你的For循环.而不是整个程序
if (isPrime(n))语句判断,isPrime(n)为真时,就会执行cout<< n << endl;打印数据
最后一行bPrime改成true,那isPrime(n)就为永真,就会打印出所有的数。
**
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
typedef struct DualNode
{
int data;
struct DualNode *prior, *next;
}DualNode, *DualList;
DualList InitList(int sign)
{
//头结点存放符号位,1为正,-1为负
DualList L;
L = (DualList)malloc(sizeof(DualNode));
L->next = L->prior = L;
L->data = sign;
return L;
}
void InsertNodeAtTail(DualList L, int data)
{
//尾插,用于存储数据的输入
DualNode *s;
s = (DualList)malloc(sizeof(DualNode));
s->data = data;
s->next = L;
s->prior = L->prior;
L->prior->next = s;
L->prior = s;
}
void InsertNodeAtHead(DualList L, int data)
{
// 即插在头结点之后,用于计算结果的存储
DualNode *s;
s = (DualList)malloc(sizeof(DualNode));
s->data = data;
s->next = L->next;
s->prior = L;
L->next->prior = s;
L->next = s;
}
void PrintList(DualList L)
{
//打印结果
int FirstTime = 1;
DualNode *p = L;
if (p->data == -1) printf("-");
p = p->next;
while(p != L)
{
if (FirstTime)
{
FirstTime = 0;
printf("%d", p->data);
}
else
{
printf(",%04d", p->data);
}
p = p->next;
}
printf("\n");
}
DualList InputData()
{
int FirstNum = 1, data;
char c;
DualList L;
L = (DualList)malloc(sizeof(DualNode));
L->next = L->prior = L;
printf("请按形式输入数据,例: -1111,1111,1111\n");
fflush(stdin);//清除键盘缓冲区
if ((c = getchar()) == '-')
L = InitList(-1);
else
L = InitList(1);
if (isdigit(c))
// 退格处理
ungetc(c, stdin);
do{
scanf("%d", &data);
InsertNodeAtTail(L, data);
}while((c = getchar()) != '\n');
//printf("输入的数据是:\n");
//PrintList(L);
return L;
}
void DelNode(DualList L, DualNode *p)
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
void Add(DualList a, DualList b, DualList c)
{
DualList pa, pb;
int carry = 0, tmp;
pa = a->prior;
pb = b->prior;
while((pa!= a) && (pb!= b))
{
tmp = pa->data + pb->data + carry;
if (tmp >= 10000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
pb = pb->prior;
}
while(pa!= a)
{
// pb = b
tmp = pa->data + carry;
if (tmp >= 10000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
while(pb!= b)
{
// pa = a
tmp = pb->data + carry;
if (tmp >= 10000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pb = pb->prior;
}
if (carry != 0)
InsertNodeAtHead(c, 1);
}
void Sub(DualList a, DualList b, DualList c)
{
DualList pa, pb, pc;
int borrow = 0,tmp;
pa = a->prior;
pb = b->prior;
while((pa != a) && (pb != b))
{
if (pa->data >= pb->data + borrow)
{
tmp = pa->data - pb->data - borrow;
borrow = 0;;
}
else
{
tmp = 10000 + pa->data - pb->data - borrow;
borrow = 1;
}
InsertNodeAtHead(c, tmp);
pa = pa->prior;
pb = pb->prior;
}
if (pa != a || (pa == a && pb == b && borrow == 0))
{
// a >= b
c->data = a->data;
}
if (c->data != a->data)
{
// a < b
pc = c->prior;
while(pc != c)
{
// 结果转换
if (pc == c->prior)
pc->data = 10000 - pc->data;
else
pc->data = 9999 - pc->data;
pc = pc->prior;
}
// 因为符号判断错误,所以borrow要取反
borrow = borrow?0:1;
while(pb != b)
{
if (pb->data >= borrow)
{
tmp = pb->data - borrow;
borrow = 0;
}
// 继续借位
else
{
tmp = 10000 + pb->data - borrow;
borrow = 1;
}
InsertNodeAtHead(c, tmp);
pb = pb -> prior;
}
}
else{
// a>b
while(pa != a)
{
if (pa->data >= borrow)
{
tmp = pa->data - borrow;
borrow = 0;
}
else
{
tmp = 10000 - pa->data - borrow;
borrow = 1;
}
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
}
pc = c->next;
while(pc->next !=c && pc->data == 0)
{
pc = pc->next;
DelNode(c, pc->prior);
}
}
DualList AddList(DualList a, DualList b)
{
DualList c;
if (a->data * b->data > 0)
{
c = InitList(a->data);
Add(a, b, c);
}else
{
c=InitList(b->data);
Sub(a, b, c);
}
if(c->next->data==0)
c->data=1;
return c;
}
DualList SubList(DualList a, DualList b)
{
DualList c;
if (a->data * b->data > 0)
{
if((a->data==-1)&&(b->data==-1))
{
b->data=1;
c=InitList(b->data);
Sub(a, b, c);
}
else
{
b->data=1;
c=InitList(b->data);
Sub(a,b,c);
}
}
else
{
c=InitList(b->data);
Add(a, b, c);
if((a->data==1)&&(b->data==-1))
c->data=1;
else c->data=-1;
}
if(c->next->data==0)
c->data=1;
return c;
}
int main()
{
char sign;
DualList a, b, c;
do{
printf("输入+号,进行加法运算\n");
printf("输入-号,进行减法运算\n");
printf("输入字母x,退出程序\n");
scanf("%s",&sign);
switch(sign)
{
case'+':
a = InputData();
b = InputData();
c = AddList(a, b);
printf("相加之后的结果是:\n");
PrintList(c);
printf("\n");
break;
case'-':
a = InputData();
b = InputData();
c = SubList(a, b);
printf("相减之后的结果是:\n");
PrintList(c);
printf("\n");
break;
case'x':
break;
case'X':
break;
default:
printf("选择错误,请重新选择\n");
}
}while(sign!='x'&&sign!='X');
printf("程序已退出\n");
return 0;
}
**