鱼C论坛

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

[已解决]小白求助

[复制链接]
发表于 2023-11-16 19:49:37 | 显示全部楼层 |阅读模式

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

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

x
题目描述
求一个正整数M有可能可以被表示为n(n>=2)个连续正整数之和,M不大于10000
输入
一个正整数M
输出
一共k行,每行一序列整数,以逗号分隔,且由小到大排列,和等于M
样例输入 复制
15
样例输出 复制
1,2,3,4,5
4,5,6
7,8
#include <stdio.h>
int main(void)
{
        int i,count,k,M,date[100];
        scanf("%d",&M);
       
        for (i = 1;i < M/2+1;i++){
                count = 1;
                while (i*count + count*(count-1)/2.0 <= (double)M){
                        if (i*count + count*(count-1)/2.0 == (double)M){
                                for (k = i;k <= count;k++){
                                        int zero = 0;
                                        date[zero++] = k;
                                }
                                for (k = 0;k < count-i;k++){
                                        printf(k == 0 ? "%d" : ",%d",date[k]);
                                }
                                putchar('\n');
                        }
                        count++;
                }
        }
               
        return 0;
}
请问这是哪里不对呀
最佳答案
2023-11-16 19:51:17
你的代码有几个问题。

首先,在存储序列整数的数组 date 中,你在每次循环中都将其初始化为 int zero = 0;,这会导致数组被重写,无法正确存储整数序列。

其次,在输出序列整数时,你没有使用正确的数组索引来访问 date 数组。你应该使用 k 作为索引,而不是 count - i

另外,你在计算连续正整数和时使用的公式也有问题。应该是 i * count + (count - 1) * count / 2,而不是 i * count + count * (count - 1) / 2.0。因为连续正整数的和是等差数列求和公式。

最后,你的代码中没有处理 M 无法表示为连续正整数之和的情况。可以在循环结束后加入一个判断,如果没有找到符合条件的序列,输出 "No solution."。

以下是修改后的代码:
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int i, count, k, M, date[100];
  5.     scanf("%d", &M);
  6.     for (i = 1; i <= M / 2 + 1; i++) {
  7.         count = 1;
  8.         while (i * count + (count - 1) * count / 2 <= M) {
  9.             if (i * count + (count - 1) * count / 2 == M) {
  10.                 int index = 0;
  11.                 for (k = i; k <= count; k++) {
  12.                     date[index++] = k;
  13.                 }
  14.                 for (k = 0; k < count - i + 1; k++) {
  15.                     printf(k == 0 ? "%d" : ",%d", date[k]);
  16.                 }
  17.                 putchar('\n');
  18.             }
  19.             count++;
  20.         }
  21.     }
  22.     if (i > M / 2 + 1) {
  23.         printf("No solution.\n");
  24.     }
  25.     return 0;
  26. }
复制代码

这样,你的代码就可以正确地输出正整数 M 可能可以被表示为连续正整数之和的序列了。

希望能帮助到你!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-16 19:49:53 | 显示全部楼层
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int i, count, k, M, date[100];
  5.     scanf("%d", &M);

  6.     for (i = 1; i < M / 2 + 1; i++) {
  7.         count = 1;
  8.         while (i * count + count * (count - 1) / 2.0 <= (double)M) {
  9.             if (i * count + count * (count - 1) / 2.0 == (double)M) {
  10.                 int zero = 0;  // 将zero的定义移至循环外部,以避免重复初始化
  11.                 for (k = i; k <= count; k++) {
  12.                     date[zero++] = k;  // 使用zero作为数组下标,记录序列整数
  13.                 }
  14.                 for (k = 0; k < count - i; k++) {
  15.                     printf(k == 0 ? "%d" : ",%d", date[k]);  // 输出序列整数
  16.                 }
  17.                 putchar('\n');
  18.             }
  19.             count++;
  20.         }
  21.     }

  22.     return 0;
  23. }
复制代码


问题分析:
1. 在每次找到符合条件的连续正整数序列时,需要将序列整数存储到数组 date 中,但是 int zero = 0; 应该放在外部循环之前,避免重复初始化导致数据丢失。
2. 在输出序列整数时,应该使用 count - i 作为循环条件,而不是 count ,以确保输出正确的序列整数。

解决方案:
将 int zero = 0; 的定义移到外部循环之前,修改 for (k = 0; k < count - i; k++) 中的循环条件,使其正确输出序列整数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-16 19:51:17 | 显示全部楼层    本楼为最佳答案   
你的代码有几个问题。

首先,在存储序列整数的数组 date 中,你在每次循环中都将其初始化为 int zero = 0;,这会导致数组被重写,无法正确存储整数序列。

其次,在输出序列整数时,你没有使用正确的数组索引来访问 date 数组。你应该使用 k 作为索引,而不是 count - i

另外,你在计算连续正整数和时使用的公式也有问题。应该是 i * count + (count - 1) * count / 2,而不是 i * count + count * (count - 1) / 2.0。因为连续正整数的和是等差数列求和公式。

最后,你的代码中没有处理 M 无法表示为连续正整数之和的情况。可以在循环结束后加入一个判断,如果没有找到符合条件的序列,输出 "No solution."。

以下是修改后的代码:
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int i, count, k, M, date[100];
  5.     scanf("%d", &M);
  6.     for (i = 1; i <= M / 2 + 1; i++) {
  7.         count = 1;
  8.         while (i * count + (count - 1) * count / 2 <= M) {
  9.             if (i * count + (count - 1) * count / 2 == M) {
  10.                 int index = 0;
  11.                 for (k = i; k <= count; k++) {
  12.                     date[index++] = k;
  13.                 }
  14.                 for (k = 0; k < count - i + 1; k++) {
  15.                     printf(k == 0 ? "%d" : ",%d", date[k]);
  16.                 }
  17.                 putchar('\n');
  18.             }
  19.             count++;
  20.         }
  21.     }
  22.     if (i > M / 2 + 1) {
  23.         printf("No solution.\n");
  24.     }
  25.     return 0;
  26. }
复制代码

这样,你的代码就可以正确地输出正整数 M 可能可以被表示为连续正整数之和的序列了。

希望能帮助到你!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 14:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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