C程序,打印用户接收范围内的Germain素数
对于从用户收到的整数C程序,打印用户接收范围内的Germain素数,c,C,对于从用户收到的整数X和Y(假设X2){ y=strtol(argv[2],NULL,0); } }否则{ printf(“输入X和Y:”); 如果(扫描频率(“%d%d”、&x和&y)!=2) 返回1; } int max=2*y+1; 无符号字符*composite=calloc(最大值+1,1); if(composite==NULL){ printf(“内存不足\n”); 返回1; } 复合[0]=1; 复合[1]=1; 对于(int p=2;p*p而言,“问题”是您从未重置counte
X
和Y
(假设X
),编写程序,将X
到Y
范围内的所有Germain素数添加到数组中,并在屏幕上打印该数组中的元素。日尔曼素数是素数,因此2p+1也是素数。此问题中将不使用附加字符串。否则,它将被评估为0
样本:
Enter X and Y: 2 15
Germain Prime Numbers in the Range: 2-3-5-11
我有一个这样的问题。我写了一个程序,但它也打印了一些错误的数字。但是,它现在不打印任何内容
这是我的密码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int x, y, i, j, k, counter = 0, counter2 = 0;
printf("Please enter x and y values:\n\a");
scanf("%d %d", &x, &y);
for (i = x; i <= y; i++) {
for (j = 1; j <= i; j++) {
if (i % j == 0) {
counter++;
}
}
if (counter == 2) {
for (k = 1; k <= 2 * i + 1; k++) {
if ((2 * i + 1) % k == 0) {
counter2++;
}
if (counter2 == 2) {
printf("%d is a germain prime number", i);
}
}
}
counter = 0;
}
return 0;
}
#包括
#包括
int main(){
int x,y,i,j,k,计数器=0,计数器2=0;
printf(“请输入x和y值:\n\a”);
scanf(“%d%d”,&x,&y);
对于(i=x;i您的代码太复杂了。主循环应该简化。此外,输出不是示例所示的
以下是问题:
- (j=1;j 1)的循环
{
x=y=strtol(argv[1],NULL,0);
如果(argc>2){
y=strtol(argv[2],NULL,0);
}
}否则{
printf(“输入X和Y:”);
如果(扫描频率(“%d%d”、&x和&y)!=2)
返回1;
}
int max=2*y+1;
无符号字符*composite=calloc(最大值+1,1);
if(composite==NULL){
printf(“内存不足\n”);
返回1;
}
复合[0]=1;
复合[1]=1;
对于(int p=2;p*p而言,“问题”是您从未重置counter2
变量和if(2*i+1%k==0)
需要括号。真正的问题是您已经实现了iPrime
功能三次,而不是只实现一次,调用两次,这会导致您陷入不必要的复杂程度中。没有太多时间调试代码。但您可以运行以下操作:
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int n)
{
// Corner case
if (n <= 1)
return false; // Check from 2 to n-1
for (int i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
bool isGermanPrime(int n)
{
return isPrime(n) && isPrime(n*2+1);
}
int main()
{
int x, y;
// printf("Please enter x and y values:\n\a");
// scanf("%d %d", &x, &y);
x = 2;
y = 15;
for (int i = x; i <= y; i++)
{
if (isGermanPrime(i))
printf("%d ", i);
}
return 0;
}
//OUTPUT
2 3 5 11
#包括
#包括
bool isPrime(int n)
{
//角盒
如果(n#包括
#包括
#包括
bool isPrime(int n){
//角盒
如果(n“编写一个程序,将X到Y范围内的所有Germain素数添加到一个数组中,并在屏幕上打印该数组中的元素。”以及“我不应该使用用户创建的函数”。如下所示
#include <stdio.h>
#define SIZE 100
int main() {
int x, y, germ, prime, gPrime;
int n[SIZE], count = 0, i, j;
scanf("%d%d", &x, &y);
if( x < 3 ) {
n[0] = 2;
++count;
x = 3;
}
else if( !(x % 2) ) {
++x;
}
for(i = x; i <= y; i += 2) {
prime = 1;
gPrime = 1;
for(j = 3; j < i; y += 2) {
if( !(i % j) ) {
prime = 0;
break;
}
}
if( prime ) {
germ = 2 * i + 1;
for(j = 3; j < germ; j += 2) {
if( !(germ % j) ) {
gPrime = 0;
break;
}
}
if( gPrime ) {
n[count] = i;
++count;
}
} // end outer if
}
for(i = 0; i < count; i++) {
printf("%d ", n[i]);
}
return 0;
}
#包括
#定义大小100
int main(){
int x,y,芽,素数,gPrime;
int n[SIZE],计数=0,i,j;
scanf(“%d%d”,&x,&y);
if(x<3){
n[0]=2;
++计数;
x=3;
}
否则如果(!(x%2)){
++x;
}
对于(i=x;i)你的代码包括一个isPrime()
函数。你为什么不使用它呢?编辑:另外,if(2*i+1%k==0)
如果你想得到合理的结果,可能应该是if((2*i+1)%k==0)
,允许的X,Y
范围是多少,整个int
范围?较大的int
值可能溢出2*i+1
,因此需要不同的处理。alpermakaveli您需要“将所有Germain素数……添加到一个数组中”,但代码中没有数组,只是输出。这是真正的要求吗?还提示if(2*i+1%k==0)
应该使用括号。是的,我添加了那个偏执词,但我不应该使用用户创建的函数。我共享代码的网站上的其他人添加了iPrime。任何人告诉你不要为此定义函数都是完全错误的,这会教你坏习惯。检查germain素数肯定有比algori更好的方法每个数字的thm检查n是否为素数,检查2n+1是否为素数(例如,首先查找某个范围内的所有素数,然后检查2n+1条件),但没有一种更好的方法可以避免定义函数。我们在讲座中没有看到函数,这就是为什么它被禁止的原因。我试图先找到素数,然后检查2p+1的素数。但是,作为一个beginner@alpermakaveli“我们在讲座中没有看到函数”-->注意intmain()
是您正在编写的一个函数。所以您至少看到了一个,一个特殊的函数。实际上我不应该使用像iPrime这样的函数。我想有人将它从codeshare中更改了。最后我修复了我的程序,但无法将这些germain素数添加到数组中。我不知道如何创建这样的循环,因为我不知道有多少germain素数的程序am将获得。对于N以下的Sophie Germain素数,可以使用近似上界10+1.6*N/log(N)²。我有一个很好的证明,但这个注释太少,无法包含:)我不应该使用用户创建的函数。iPrime是由我共享代码的网站上的其他人添加的。你必须编写自己的iPrime版本,如果我要为你编写一个,那也是不可接受的。是的,那肯定是不可捕获的。我只是来找出我的错误所在并修复它。我不应该使用函数由用户创建。iPrime是由其他人从我共享代码的网站添加的。好吧,抱歉,我不知道。我以为是你做的功能。这是我的错,忘了删除它。有可能没有它吗?没有输出,但它给了我灵感,谢谢。我认为这是因为时间限制。无论如何,非常欢迎你
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int x, y, counter = 0;
if (argc > 1) {
x = y = strtol(argv[1], NULL, 0);
if (argc > 2) {
y = strtol(argv[2], NULL, 0);
}
} else {
printf("Enter X and Y: ");
if (scanf("%d %d", &x, &y) != 2)
return 1;
}
int max = 2 * y + 1;
unsigned char *composite = calloc(max + 1, 1);
if (composite == NULL) {
printf("out of memory\n");
return 1;
}
composite[0] = 1;
composite[1] = 1;
for (int p = 2; p * p <= max; p++) {
if (composite[p])
continue;
for (int i = p * p; i <= max; i += p)
composite[i] = 1;
}
for (int p = x; p <= y; p++) {
if (composite[p] || composite[2 * p + 1])
continue;
counter++;
//printf("%d\n", p);
}
free(composite);
printf("Count of Germain primes between %d and %d: %d\n", x, y, counter);
printf("approximation for count to %d: 10+1.6*N/log(N)²=%.2f\n",
y, 10 + 1.6 * y / (log(y) * log(y)));
return 0;
}
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int n)
{
// Corner case
if (n <= 1)
return false; // Check from 2 to n-1
for (int i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
bool isGermanPrime(int n)
{
return isPrime(n) && isPrime(n*2+1);
}
int main()
{
int x, y;
// printf("Please enter x and y values:\n\a");
// scanf("%d %d", &x, &y);
x = 2;
y = 15;
for (int i = x; i <= y; i++)
{
if (isGermanPrime(i))
printf("%d ", i);
}
return 0;
}
//OUTPUT
2 3 5 11
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool isPrime(int n) {
// Corner case
if (n <= 1)
return false;
// Check from 2 to n-1
for (int i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
int main() {
int x, y;
printf("Please enter x and y values:\n\a");
scanf("%d %d", &x, &y);
for (int p = x; p < y; p++) {
if (isPrime(p) && isPrime(2 * p + 1)) {
printf("%d is a germain prime number\n", p);
}
}
return 0;
}
#include <stdio.h>
#define SIZE 100
int main() {
int x, y, germ, prime, gPrime;
int n[SIZE], count = 0, i, j;
scanf("%d%d", &x, &y);
if( x < 3 ) {
n[0] = 2;
++count;
x = 3;
}
else if( !(x % 2) ) {
++x;
}
for(i = x; i <= y; i += 2) {
prime = 1;
gPrime = 1;
for(j = 3; j < i; y += 2) {
if( !(i % j) ) {
prime = 0;
break;
}
}
if( prime ) {
germ = 2 * i + 1;
for(j = 3; j < germ; j += 2) {
if( !(germ % j) ) {
gPrime = 0;
break;
}
}
if( gPrime ) {
n[count] = i;
++count;
}
} // end outer if
}
for(i = 0; i < count; i++) {
printf("%d ", n[i]);
}
return 0;
}