鱼C论坛

 找回密码
 立即注册
查看: 1003|回复: 2

[已解决]c语习题

[复制链接]
发表于 2023-7-16 15:23:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:查找介于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[5]= {0},size=0;
    do
    {
        num[size]=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 900int validate(int n) {    int i, j, k = 0, num[5] = {0}, size = 0;        do {        num[size] = n % 10;        n = n / 10;        size++;    } while (n > 0);        for (i = 0; i < size; i++) {        for (j = i + 1; j < size; j++) {            if (num[i] == num[j]) {                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个的格式打印输出。希望能帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 900int validate(int n) {    int i, j, k = 0, num[5] = {0}, size = 0;        do {        num[size] = n % 10;        n = n / 10;        size++;    } while (n > 0);        for (i = 0; i < size; i++) {        for (j = i + 1; j < size; j++) {            if (num[i] == num[j]) {                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个的格式打印输出。希望能帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-16 15:24:07 | 显示全部楼层
题目中的问题主要是要你填充 validate 函数的部分,以便它能正确地确定一个整数是否有且仅有两个相同的数字位。这里的关键是计数每个数字位上出现的次数,如果存在且仅存在一个数字位出现两次,那么函数应该返回 1 ,否则返回 0 。

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

以下是 validate 函数的完整代码:
int validate(int n){    int i,j,k=0,num[5]= {0},size=0;    int cnt[10] = {0};  // 数组cnt用来记录每个数字位出现的次数    do    {        num[size]=n%10;        cnt[num[size]]++;  // 更新数字位的计数器        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[num[size]]++ 。这行代码会在每次循环中增加相应数字位的计数器。然后在 /**********Program**********/ 和 /**********  End  **********/ 之间的部分,我添加了一个循环,这个循环会检查每个数字位的计数器。如果有一个数字位的计数器恰好为2,那么变量 k 就会增加。最后,函数返回 k==1 的结果,即如果存在且仅存在一个数字位出现两次,函数返回 1 ,否则返回 0 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表