You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

整数分割质数统计问题求解及C语言代码后续实现指导

滑动分割数字并统计质数数量实现指导

需求说明

输入两个正整数A和B,将A的数字按长度B进行滑动分割(示例:A=1234、B=2时,分割为12、23、34),统计这些分割出的数字中的质数数量。以下是已完成输入部分的代码,后续实现方向如下:

现有代码

#include <stdio.h>

int main() {
    int A, B, i, contador;
    // 输入数字A并验证为正整数
    for (i = 0; i != -1; i++) {
        printf("\nIngrese el numero A :");
        scanf("%d", &A);
        if (A > 0) {
            break;
        }
    }
    // 输入数字B并验证为正整数
    for (i = 0; i != -1; i++) {
        printf("\nIngrese el numero B :");
        scanf("%d", &B);
        if (B > 0) {
            break;
        }
    }
 
    printf("A\t\tB\t\tCifras\t\tCantidad Primos\n");
    printf("%d\t\t%d", A, B);
 
    return 0;
}

后续实现步骤

1. 计算A的位数并验证B的合法性

首先需要确定A的数字位数,判断B是否小于等于该位数(否则无法进行滑动分割),若不合法需提示用户重新输入B:

// 计算数字的位数
int get_digit_count(int num) {
    int count = 0;
    while (num > 0) {
        count++;
        num /= 10;
    }
    return count;
}

// 在输入B的循环后添加验证
int digit_count = get_digit_count(A);
while (B > digit_count) {
    printf("\nB不能大于A的位数,请重新输入B:");
    scanf("%d", &B);
}

2. 滑动分割出所有长度为B的数字

可以选择两种方法实现:

方法一:字符串处理法(直观易理解)

将A转为字符串后直接截取子串,再转换为整数:

#include <string.h>
#include <stdlib.h>

// ... 现有代码 ...

char a_str[20]; // 假设A的位数不超过20
sprintf(a_str, "%d", A);
int total_segments = digit_count - B + 1;
int segments[total_segments];

for (int j = 0; j < total_segments; j++) {
    char sub_str[B + 1];
    strncpy(sub_str, a_str + j, B);
    sub_str[B] = '\0'; // 确保字符串以结束符收尾
    segments[j] = atoi(sub_str);
}

方法二:数学计算法(无需字符串操作)

通过取模和除法提取每一段数字,注意结果需要反转:

// ... 现有代码 ...

int divisor = 1;
for (int j = 0; j < B; j++) {
    divisor *= 10;
}
int temp = A;
int total_segments = digit_count - B + 1;
int segments[total_segments];

// 提取逆序的分割段
for (int j = 0; j < total_segments; j++) {
    segments[j] = temp % divisor;
    temp /= 10;
}
// 反转数组得到正确顺序
for (int j = 0; j < total_segments / 2; j++) {
    int temp_val = segments[j];
    segments[j] = segments[total_segments - 1 - j];
    segments[total_segments - 1 - j] = temp_val;
}

3. 实现质数判断函数并统计数量

编写高效的质数判断函数,遍历所有分割段统计质数个数:

// 判断是否为质数:返回1是质数,0不是
int is_prime(int num) {
    if (num < 2) return 0;
    if (num == 2) return 1;
    if (num % 2 == 0) return 0;
    // 只遍历奇数,减少循环次数
    for (int j = 3; j * j <= num; j += 2) {
        if (num % j == 0) return 0;
    }
    return 1;
}

// 统计质数数量
int prime_count = 0;
for (int j = 0; j < total_segments; j++) {
    if (is_prime(segments[j])) {
        prime_count++;
    }
}

4. 完善输出内容

补充输出分割段数量(Cifras)和质数统计结果:

printf("\t\t%d\t\t%d\n", total_segments, prime_count);

边界情况提示

  • 当B等于A的位数时,仅需判断A本身是否为质数
  • 若分割出的数字含前导零(如A=1023、B=2时的02),转换为整数后会自动忽略前导零,不影响质数判断

内容的提问来源于stack exchange,提问作者Curiosity Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:00:59