我自己检查了几遍代码未发现错误,但程序运行没有输出,如何解决?

头歌上的C语言训练题。我自己检查了几遍代码未发现错误,但程序运行没有输出。望指正。

img

#include<stdio.h>
int x(int n)
{
    int sum=0;
    for(int j=1;j<n/2;j++)
        if(n%j==0)
            sum+=j;
    return sum;
}
void solve(){
    /*********Begin*********/
int a,b;
for(int i=1;i<=3000;i++){
    a=x(i),b=x(a);
    if((i==b)&&(i<a))
        printf("(%d,%d)",i,a);
}
    

    /*********End**********/ 
}
int main(void)
{  
    solve();
    return 0;
}


问题在 int x(int n) 求因子和的函数里,因子计算里少循环一次,修改如下,改动处见注释,供参考:

#include<stdio.h>
int x(int n)
{
    int sum=0;
    for(int j=1;j<=n/2;j++) //for(int j=1;j<n/2;j++) 修改
        if(n%j==0)
            sum+=j;
    return sum;
}
void solve(){
    /*********Begin*********/
int a,b;
for(int i=1;i<=3000;i++){
    a=x(i),b=x(a);
    if((i==b)&&(i<a))
        printf("(%d,%d)",i,a);
}


    /*********End**********/
}
int main(void)
{
    solve();
    return 0;
}

没有打印,说明if内条件不满足呗。
i ==b 本来就只有i=24时,但此时a=24,所以i < a不满足就没有输出

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/386145
  • 你也可以参考下这篇文章:验证歌德巴赫猜想:任何一个不小于6的偶数可以表示为两个素数之和(C语言)
  • 除此之外, 这篇博客: C语言程序设计·头歌实训合集中的 第8关:计算两个正整数的最大公约数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    任务描述
    编程计算两个正整数的最大公约数。其中求最大公约数的函数原型已经给出,请在主函数中编程调用函数,输出最大公约数。
    程序的运行示例:
    12,3↙
    3
    ####函数原型说明
    求最大公约数的函数原型如下:
    int MaxCommonFactor( int a, int b);
    返回值:返回的是最大公约数;若输入的数据有任意一个不满足条件,返回值是-1。
    参数:a,b是两个整型数
    相关知识
    本任务主要考察函数的调用方法。
    ####编程要求
    根据提示,在右侧编辑器Begin-End处补充代码,编程计算两个正整数的最大公约数。
    输入:输入格式:“%d,%d”
    输出:输出格式:“%d\n”
    测试说明
    平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
    样例输入:
    467,465
    样例输出:
    1
    开始你的任务吧,祝你成功!

    #include<stdio.h>
    int MaxCommonFactor( int a, int b)
    { 
       int c; 
       if(a<=0||b<=0) 
          return -1; 
       while(b!=0)
       { 
         c=a%b; 
         a=b;
         b=c;
       } 
      return a; 
    }   
    int main(void)
    	{  
    	  /*********Begin*********/
    	  int a,b;
        scanf("%d,%d",&a,&b);
        printf("%d",MaxCommonFactor(a,b));
    	  
    	  /*********End**********/ 
        return 0;
    }
    
    
  • 您还可以看一下 任苹蜻老师的从零开发一个iOS企业级项目实战之我的云音乐视频 教程课程中的 如何实现逐行歌词滚动小节, 巩固相关知识点
  • 以下回答来自chatgpt:
    1. 请问您是在进行哪个具体的C语言训练题呢?

    2. 您检查代码的方法是什么?是否已经尝试过执行调试,查看程序运行过程中的哪些地方出现了问题呢?

    针对段落0中提到的问题,可以考虑添加如下的代码来进行调试和定位问题:

    int *p = NULL;
    *p = 10;
    

    这段代码会将一个指针p设置为NULL,再用*p的方式对它进行赋值操作,这时候就会触发segmentation fault(SIGSEGV)错误,程序运行时会直接崩溃。通过这种方式可以定位出哪些指针没有被初始化或者被设置为了NULL导致了问题的发生。

    1. 另外,您可以提供代码片段或完整代码以便更好地帮助您解决问题。

    针对段落1中提到的排序问题,可以将函数改为如下形式,可以避免在内部直接修改pc的内容,从而增强代码的可读性和可维护性:

    void Sort(Contact pc)
    {
        for(int i=0; i<pc.sz-1; i++)
            for (int j = i + 1; j < pc.sz; j++)
            {
                PeoInfo tmp = { 0 };
                if (strcmp(pc.PeoInfo[i].name, pc.PeoInfo[j].name) > 0)
                {
                    tmp = pc.PeoInfo[i];
                    pc.PeoInfo[i] = pc.PeoInfo[j];
                    pc.PeoInfo[j] = tmp;
                }
            }
        printf("排序成功\n");
    }
    

    针对段落2中提到的文件打开和关闭问题,在使用文件时,需要打开文件才能进行读写,当不使用的时候可以进行关闭操作,以释放系统资源:

    #include <stdio.h>
    
    int main() {
        FILE* fp = fopen("test.txt", "r");
        if (fp == NULL) {
            printf("文件打开失败");
            return -1;
        }
    
        // 文件读写操作
        // ...
    
        fclose(fp);
        return 0;
    }
    

    针对段落4中提到的通过姓名查找联系人的位置问题,可以使用循环来逐个查找:

    int SearchByName(Contact pc, char* name)
    {
        for (int i = 0; i < pc.sz; i++)
            if (strcmp(pc.PeoInfo[i].name, name) == 0)
                return i;
        return -1;
    }
    

    针对段落5中提到的动态内存分配问题,如果一个指针没有被初始化或者被设置为NULL时,访问该指针指向的内存空间就会产生问题,可以通过加入断言来进行判断和防止问题的发生:

    #include <assert.h>
    
    struct node {
        int Data;
        struct node *next;
    };
    
    int main()
    {
        struct node *A = (struct node *)malloc(sizeof(struct node));
        assert(A != NULL);
        assert(A->next == NULL);
    
        A->next = (struct node *)malloc(sizeof(struct node));
        assert(A->next != NULL);
    
        A->next->Data = 3;
        A->next->next = NULL;
    
        A = A->next;
    
        printf("%d", A->Data);
        return 0;
    }
    

    这种方式可以在程序运行时及时发现问题,避免由于野指针或者其他问题导致的程序崩溃和数据丢失等情况。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^