头歌上的C语言训练题。我自己检查了几遍代码未发现错误,但程序运行没有输出。望指正。
#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不满足就没有输出
任务描述
编程计算两个正整数的最大公约数。其中求最大公约数的函数原型已经给出,请在主函数中编程调用函数,输出最大公约数。
程序的运行示例:
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;
}
请问您是在进行哪个具体的C语言训练题呢?
您检查代码的方法是什么?是否已经尝试过执行调试,查看程序运行过程中的哪些地方出现了问题呢?
针对段落0中提到的问题,可以考虑添加如下的代码来进行调试和定位问题:
int *p = NULL;
*p = 10;
这段代码会将一个指针p设置为NULL,再用*p的方式对它进行赋值操作,这时候就会触发segmentation fault(SIGSEGV)错误,程序运行时会直接崩溃。通过这种方式可以定位出哪些指针没有被初始化或者被设置为了NULL导致了问题的发生。
针对段落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;
}
这种方式可以在程序运行时及时发现问题,避免由于野指针或者其他问题导致的程序崩溃和数据丢失等情况。