今天又被素数卡住了
突然发现CPP(C Primer Plus不是C++)上面的例子也并非能解决目前遇到的题目,所以不要盲目套用啊孩子,重要的是学习他的思路
最后发现原来是数学知识问题......
我们来看看同一道题两种做法会产生怎样不同的合奏
题目
刚到手的疑问
Q: 怎么区分素数和合数
A: 用标记 和IF语句,若程序运行到IF里面,说明是合数,则改变标记的值
Q: 循环到哪一步为止
A:到除数为N的根号为止
Q: 若出现多次幂的情况怎么舍去一个输出
A: 用IF判断即可
解答过程
一 、乱套CPP
#include<stdio.h>
#include<math.h>
int main()
{
int i;
int n = 0;
int bool = 1;
scanf_s("%d", &n);
for (i = 2;i*i <= n; i++)
{
if (n % i == 0)
{
if ((i * i) != n)
printf("%d %d", i, n / i);
else
printf("%d", i);
bool = 0;
break;
}
}
if (bool)
printf("%d", n);
return 0;
}
输出结果
显然错误
二、书朗超级思路
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;//判断的数;
for (int i = 2; i <= n; i++)
{
if (n % i == 0)
{
printf("%d ", i);
while (n % i == 0)
{
n = n / i;
}
}
}
return 0;
}
输出结果
和答案一模一样
事后分析
要搞清楚哪里哪里出错了,首先要确定“素数因子”到底是什么东西
素数:
只能被“1”和它本身整除的数叫素数,如:2、3、5、7、11等,“1”既不是素数也不是合数。
因子:
如果整数a能被整数b整除,那就有一个整数q,使得 a=bq,则b和q都称为a的一个因子
因此素数因子既是素数又是因子,故在做循环得除数时得到的只是因子(CPP做法),还要进一步进行筛选(书卷做法)
当然,CPP本身没错,错的是我这个乱COPY的人
就当预习一下标记的使用了