2024.1.28C语言作业代码

本文介绍了两种在C++中计算两个整数m和n最小公倍数的方法,分别是直接判断法和辗转相除法,并提供了相应的代码示例。
#define _CRT_SECURE_NO_WARNINGS
//⽅法1
#include <stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	//计算m和n的较⼤值
	//m和n的最⼩公倍数,最⼩也是m和n中较⼤的值
	int k = (m > n ? m : n);
	//重复对k进⾏判断
	while (1)
	{
		//若k被两数同时整除,则k为公倍数,并且此时⼀定是最⼩公倍数 if (k % m == 0 && k % n == 0)
		{
			printf("%d\n", k);
				break;
		}
		//k的值加⼀,对下⼀个数进⾏判断
		k++;
	}
	return 0;
}
//⽅法2
#include <stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	//输⼊
	scanf("%d %d", &m, &n);//18 24
	int k = 0;
	int mul = m * n;
	//辗转相除法求得最⼤公约数
	while (k = m % n)
	{
		m = n;
		n = k;
	}
	printf("%d\n", mul / n);
	return 0;
}

题目描述:
输入2个整数m和n,计算m和n的最小公倍数,并打印出结果

<think>我们正在解决使用gcc编译时出现的未定义引用'sin'和'pow'函数的问题。这些函数属于数学库,通常需要显式链接数学库。 错误信息示例:`undefined reference to 'sin'` 和 `undefined reference to 'pow'` 解决方法:在编译命令末尾添加 `-lm` 选项,表示链接数学库(libm)。 示例: 原编译命令:`gcc romberg.c -o romberg` 修改后:`gcc romberg.c -o romberg -lm` 注意:由于链接器的参数顺序问题,建议将`-lm`放在源文件后面。因为链接器按照从左到右的顺序处理库,如果库放在源文件前面,可能无法解析源文件中的函数引用。 原因:数学函数(如sin, cos, pow, exp等)在libm库中实现,而gcc默认不会链接该库,需要显式指定。 另外,确保代码中包含了正确的头文件: 对于sin, cos等三角函数,以及pow函数,需要包含`<math.h>`。 检查代码: 在源文件开头应该有: #include <math.h> 如果已经包含了头文件,那么问题就是链接时缺少数学库。 完整步骤: 1. 确保代码中包含了`#include <math.h>` 2. 编译时在命令末尾添加`-lm`选项 示例代码(romberg.c)中已经包含了math.h,所以只需在编译时链接数学库。 如果问题仍然存在,请检查gcc版本和系统是否安装了数学库(一般都会默认安装)。 下面给出一个完整的示例编译过程: 假设有源文件romberg.c,内容如下(包含之前的优化Romberg代码,并使用了sin和pow): 编译命令: gcc romberg.c -o romberg -lm 运行: ./romberg 这样应该能解决未定义引用的错误。 如果还有问题,请检查代码中函数名是否写错(例如,pow和sin都是小写,C语言区分大小写)。 注意:在代码中,我们使用了`M_PI`,如果之前没有定义,可以按照之前的方式定义,或者使用`acos(-1.0)`。 下面附上完整代码(包含M_PI的定义和头文件,以及链接数学库的编译指令): </think>### 解决未定义引用'sin'、'pow'函数的编译问题 当使用gcc编译包含数学函数的代码时,出现`undefined reference to 'sin'`或`undefined reference to 'pow'`错误,是因为**未正确链接数学库libm**。以下是完整解决方案: --- #### 1. 根本原因分析 - `sin()`和`pow()`等数学函数定义在**libm数学库**中 - gcc默认不链接数学库,需要显式指定 - 错误本质是**链接阶段**找不到函数实现(非编译错误) - 错误信息示例: ``` /tmp/ccfC9RU1.o: In function 'f': romberg.c:(.text+0x1b): undefined reference to 'sin' ``` --- #### 2. 解决方案:显式链接数学库 ##### (1) 基本修复方法(推荐) 在编译命令末尾添加 **`-lm`** 选项: ```bash gcc romberg.c -o romberg -lm ``` - `-l`:链接库的指令前缀 - `m`:数学库libm的缩写(对应`libm.so`共享库) - **顺序很重要**:必须放在源文件名之后 ##### (2) 验证编译命令 ```bash # 完整编译流程示例 gcc -Wall -Wextra romberg.c -o romberg -lm # 编译+链接 ./romberg # 运行程序 ``` --- #### 3. 代码层验证 确保代码包含正确的头文件: ```c #include <math.h> // 必须包含此头文件 #ifndef M_PI // 解决M_PI问题 #define M_PI 3.14159265358979323846 #endif double f(double x) { return sin(x); // 使用sin() } ``` --- #### 4. 进阶问题排查 如果仍有错误,尝试以下步骤: 1. **检查库路径**: ```bash # 确认libm存在 ls /usr/lib/libm.so* # 或 /usr/lib/x86_64-linux-gnu/libm.so* # 指定库路径(如有必要) gcc romberg.c -o romberg -L/usr/lib/x86_64-linux-gnu -lm ``` 2. **静态链接**(嵌入式场景): ```bash gcc romberg.c -o romberg -static -lm ``` 3. **检查函数签名**: ```c // 常见错误:整数参数调用pow double result = pow(2, 3.0); // ✔ 正确:2^3.0 // double result = pow(2, 3); // ⚠ 可能出错 ``` --- #### 5. 技术原理 - **编译流程**: ```mermaid graph LR A[预处理] --> B[编译] B --> C[汇编] C --> D[链接] -- libm缺失 --> E[未定义引用] ``` - 链接器通过`-lm`在以下路径搜索数学库: ``` /usr/lib/ /usr/local/lib/ /lib/ ``` --- #### 6. 完整示例 ```c #include <stdio.h> #include <math.h> // 关键头文件 #ifndef M_PI #define M_PI 3.14159265358979323846 #endif int main() { double x = M_PI/4; printf("sin(π/4) = %.6f\n", sin(x)); printf("2^3 = %.0f\n", pow(2, 3.0)); // 注意用浮点数 return 0; } ``` 编译执行: ```bash gcc example.c -o example -lm && ./example # 输出: # sin(π/4) = 0.707107 # 2^3 = 8 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值