简单题,自己的思路还不是很熟练
读题又读了半天,,,
学习打印素数表:
方法一:
把当前数的倍数都标为 非素数即可,双循环
memset(check, 0, sizeof(check));
for (int i = 2; i <= n; i++)
{
if (!check[i]) //是素数就放到结果数组中
prime[count++] = i;
for (int j = i + i; j <= n; j += i)
check[j] = 1;
}
for (int i = 0; i < count; i++)
printf("%d\n", prime[i]);
方法二:
方法一会有重复标记的地方,简化
memset(check, 0, sizeof(check));
count = 0;
for (int i = 2; i <= n; i++)
{
if (!check[i])
prime[count++] = i;
for (int j = 0; j < count; j++)
{
if (i*prime[j] > MAXL)
break; // 过大的时候跳出
check[i*prime[j]] = 1;
if ((i%prime[j]) == 0) // 如果i是一个合数,而且i % prime[j] == 0
break;
}
}
for (int i = 0; i < count; i++)
printf("%d\n", prime[i]);
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
long long n;
vector<int> arr(500000,1);
int main(){
scanf("%lld",&n);
printf("%lld=",n);
if(n==1) printf("1");
for(int i = 2; i * i < 500000; i++)
for(int j = 2; j * i < 500000; j++)
arr[j * i] = 0;
bool key = false;
for(int i=2; n>=2 ; i++){
int k = 0, cnt = 0;
while(arr[i]==1&&n%i==0){
cnt++;
n = n/i;
k = 1;
}
if(k==1){
if(key) printf("*");
printf("%d",i);
key = true;
}
if(cnt >= 2) printf("^%d",cnt);
}
return 0;
}
明天六级,还有点小紧张,,