ZxZ. 发表于 2023-7-16 15:23:35

c语习题

题目:查找介于M与N(0<M<N<32768)之间,且满足下列条件的所有整数:
      1.该数中有且仅有两个相同的数字位;
      2.该数是素数。


在/**********Program**********/
   



    /**********End**********/中填空

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>

#define M 800
#define N 900

int validate(int n)
{
    int i,j,k=0,num= {0},size=0;
    do
    {
      num=n%10;
      n=n/10;
      size++;   
    }
    /**********Program**********/
   



    /**********End**********/
    if(k==1)
      return 1;
    else
      return 0;
}
int prime(int n)
{
    int i;
    for(i=2; i<(int)sqrt(n); i++)
      if(n%i==0)
            return 0;
    return 1;
}

int main()
{
    int i,count=0,n1=0,n2=0;
    for(i=M; i<=N; i++)
    {
      if(validate(i)&&prime(i))
      {
            count++;
            printf("%6d",i);
            if(count%8==0)
            printf("\n");
      }
    }
    printf("\n");
}

陶远航 发表于 2023-7-16 15:23:52

你需要在 /**********Program**********//**********End**********/ 的部分填写代码来实现查找符合条件的整数。以下是填空部分的完整代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>

#define M 800
#define N 900

int validate(int n) {
    int i, j, k = 0, num = {0}, size = 0;
   
    do {
      num = n % 10;
      n = n / 10;
      size++;
    } while (n > 0);
   
    for (i = 0; i < size; i++) {
      for (j = i + 1; j < size; j++) {
            if (num == num) {
                k++;
            }
      }
    }
   
    if (k == 1) {
      return 1;
    } else {
      return 0;
    }
}

int prime(int n) {
    int i;
    for (i = 2; i <= (int)sqrt(n); i++) {
      if (n % i == 0) {
            return 0;
      }
    }
    return 1;
}

int main() {
    int i, count = 0, n1 = 0, n2 = 0;

    for (i = M; i <= N; i++) {
      if (validate(i) && prime(i)) {
            count++;
            printf("%6d", i);
            if (count % 8 == 0) {
                printf("\n");
            }
      }
    }
   
    printf("\n");
   
    return 0;
}


在 validate 函数中,我添加了两个嵌套的循环来检查数字中是否有且仅有两个相同的数字位。在 prime 函数中,我更正了循环条件的错误。

这个程序会在给定的范围内查找满足条件的整数,并按照每行8个的格式打印输出。希望能帮到你!

isdkz 发表于 2023-7-16 15:24:07

题目中的问题主要是要你填充 validate 函数的部分,以便它能正确地确定一个整数是否有且仅有两个相同的数字位。这里的关键是计数每个数字位上出现的次数,如果存在且仅存在一个数字位出现两次,那么函数应该返回 1 ,否则返回 0 。

你可以创建一个长度为10的数组 cnt 来跟踪每个数字位上的出现次数。数组的索引代表数字位(0-9),数组的值代表该数字位出现的次数。

以下是 validate 函数的完整代码:

int validate(int n)
{
    int i,j,k=0,num= {0},size=0;
    int cnt = {0};// 数组cnt用来记录每个数字位出现的次数
    do
    {
      num=n%10;
      cnt]++;// 更新数字位的计数器
      n=n/10;
      size++;   
    }
    while(n>0);// 当n不再有数字位时,结束循环

    /**********Program**********/
    for(i=0; i<10; i++)
    {
      if(cnt[ i]==2)// 如果某个数字位出现两次
            k++;
    }
    /**********End**********/
    if(k==1)
      return 1;
    else
      return 0;
}


在这段代码中,我在循环中增加了一行 cnt]++ 。这行代码会在每次循环中增加相应数字位的计数器。然后在 /**********Program**********/ 和 /**********End**********/ 之间的部分,我添加了一个循环,这个循环会检查每个数字位的计数器。如果有一个数字位的计数器恰好为2,那么变量 k 就会增加。最后,函数返回 k==1 的结果,即如果存在且仅存在一个数字位出现两次,函数返回 1 ,否则返回 0 。
页: [1]
查看完整版本: c语习题