C语言(不允许创建临时变量交换两个数的内容;求十个整数中的最大值;求两个数的最大公约数;1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值;1-100中9出现次数)

博客围绕C语言展开,但具体内容缺失。C语言是后端开发常用语言,在众多领域有广泛应用。
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//1.给定两个整形变量的值,将两个值的内容进行交换。
int main(){
	int a = 0;
	int b = 0;
	int c = 0;
	printf("请输入两个数,并用空格隔开。\na=\tb=\n");
	scanf("%d %d", &a, &b);
	c = a;
	a = b;
	b = c;
	printf("交换后两数为:a=%d,b=%d\n", a, b);

	system("pause");
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//2.不允许创建临时变量,交换两个数的内容。
int main(){
	int a = 0;
	int b = 0;
	printf("请输入两个数,并用空格隔开\na=\tb=\n");
	scanf("%d %d", &a, &b);
	a = a + b;  // a = a * b;
	b = a - b;  //  b = a / b;
	a = a - b;  //  a = a / b;   加法和乘法都可以
	printf("交换后的两数为:\na=%d\nb=%d\n", a, b);
	system("pause");
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////


#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//3.求十个整数中的最大值。
int main(){
	int arr[] = { 1, 23, 3, 47, 5, 6, 7, 8, 2, 55 };
	int max = 0;
	for (int i = 0; i < 9; i++){
		if (arr[i] >= arr[i + 1]){
			arr[i + 1] = arr[i];
		}
		else{
			max = arr[i + 1];
		}
	}
	printf("这十个数中最大的数为:%d\n", max);
	system("pause");
	return 0;
}


////////////////////////////////////////////////////////////////////////////////////////////////


#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//4.将三个数按从小到大输出。
int main(){
	int a = 0;
	int b = 0;
	int c = 0;
	printf("请输入三个数,并用空格隔开。\n");
	scanf("%d %d %d", &a, &b, &c);
	if (a > b){
		int t = b;
		b = a;
		a = t;
		if (c > b){
			printf("从小到大为:%d %d %d\n", a, b, c);
		}
		else if (c < b&&a < c){
			printf("从小到大为:%d %d %d\n", a, c, b);
		}
		else if (c < a){
			printf("从小到大为:%d %d %d\n", c, a, b);
		}
	}
	else{
		if (c > b){
			printf("从小到大为:%d %d %d\n", a, b, c);
		}
		else if (c < b&&a < c){
			printf("从小到大为:%d %d %d\n", a, c, b);
		}
		else if (c < a){
			printf("从小到大为:%d %d %d\n", c, a, b);
		}
	}
	system("pause");
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//5.求两个数的最大公约数。
int main(){
	int a = 0;
	int b = 0;
	printf("请输入两个正整数,并用空格隔开。\n");
	scanf("%d %d", &a, &b);
	if (a > b){
		if (a%b == 0){
			printf("两数的最大公约数为:%d\n", b);
		}
		else{
			for (int i = b; i >= 1; i--) {
				if (b%i == 0 && a%i == 0){
					printf("两数的最大公约数为:%d\n ", i);
				}
			}
		}
	}
	else{
		if (b%a == 0){
			printf("两数的最大公约数为:%d\n ", a);
		}
		else{
			for (int i = a; i >= 1; i--) {
				if (b%i == 0 && a%i == 0){
					printf("两数的最大公约数为:%d\n ", i);
				}
			}
		}
	}

	system("pause");
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////


#include <stdio.h>
#include <stdlib.h>
//6.将数组a中的内容与b中的内容交换(数组一样大)。
int main(){
	int a[] = { 1, 2, 3, 4, 5 };
	int b[] = { 5, 4, 3, 2, 1 };
	int c[5];
	for (int i = 0; i < 5; i++){
		c[i] = a[i];
		a[i] = b[i];
		b[i] = c[i];
	}
	printf("数组a为:%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
	printf("数组b为:%d %d %d %d %d\n", b[0], b[1], b[2], b[3], b[4]);
	system("pause");
	return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////


#include <stdio.h>
#include <stdlib.h>
//7.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
int main(){
	double sum = 0;
	double reduce = 0;
	double result = 0;
	for (int i = 1; i <= 100; i += 2){
		sum += 1 / i;
	}
	for (int j = 2; j <= 100; j += 2){
		reduce -= 1 / j;
	}
	result = sum + reduce;
	printf("1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值为:%f", result);
	system("pause");
	return 0;
}


////////////////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
//8.编写程序数一下 1到 100 的所有整数中出现多少次数字9。 
int main(){
	int count = 0;
	for (int i = 1; i <= 100; i++){
		if ((i % 10 == 9) || (i / 10 == 9)){
			count++;
		}
	}
	printf("1-100中所有整数出现数字9的次数为:%d\n", count);
	system("pause");
	return 0;
}
<think>好的,用户想用C语言实现辗转相除法来计算最大公约数。我需要根据提供的引用资料来整理出正确的代码示例,并解释其原理。首先,引用[1][2]都提到了辗转相除法的核心思想,即用较大的数除以较小的数,然后用余数替换较大的数,重复这个过程直到余数为零,最后的除数就是最大公约数。 引用[2]中的代码展示了一个使用循环的方法,定义了一个gcd函数,其中通过断更新被除数除数来计算余数,直到余数为零,返回当前的除数作为结果。而引用[3]则提供了递归实现的C++代码,但用户需要C语言版本,所以可能需要调整语法。引用[4]使用了另一种方法,但看起来效率高,所以可能作为主要参考。 接下来,我需要确保代码的正确性。在C语言中,递归循环都可以实现。用户可能需要种方法的示例。比如,引用[2]的循环方法已经是一个好的例子,而递归方法可以类似引用[3],但需要转换成C语言。需要注意的是,递归虽然简洁,但在处理大数时可能会有栈溢出的风险。 另外,需要解释代码的步骤,比如处理输入的个数,确保无论输入顺序如何都能正确处理,例如在循环中交换ab的位置,或者在函数开始时处理数的大小。例如,在引用[2]的代码中,函数内部并没有显式比较ab的大小,因为当a小于b时,第一次循环会交换它们的。例如,如果a=12,b=18,第一次c=12%18=12,然后a变成18,b变成12,c=18%12=6,依此类推,直到余数为零,返回b=6。 还需要注意输入处理,比如使用scanf获取用户输入,并处理可能的负数,但最大公约数通常考虑正数,所以在代码中可能需要取绝对过引用中的例子并没有处理负数,可能需要提醒用户这一点。 总结步骤的话,首先是函数实现,无论是循环还是递归,然后是主函数中的输入输出。要确保代码示例的正确性,并解释关键步骤,比如余数的计算变量的更新。同时,可以提到时间复杂度的优势,如引用[3]提到的O(log n)的时间复杂度,说明算法的高效性。 最后,用户可能还希望知道如何验证代码的正确性,比如测试用例,或者如何扩展代码最小公倍数,这可能涉及到公式:最小公倍数 = 数乘积 / 最大公约数过根据用户的问题,可能需要这部分,但可以作为相关问题之一。 现在需要整理这些思考,按照用户的要,用中文给出结构清晰的回答,包含代码示例解释,并生成相关问题。</think>### C语言实现辗转相除法最大公约数 辗转相除法(欧几里得算法)通过递归或循环的方式,利用数相除的余数逐步缩小问题规模,最终最大公约数[^1][^3]。其时间复杂度为 $O(\log n)$,适用于大数计算。 #### 方法一:循环实现 ```c #include <stdio.h> int gcd(int a, int b) { int c = a % b; // 计算余数 while (c != 0) { a = b; // 更新被除数为原除数 b = c; // 更新除数为余数 c = a % b; // 重新计算余数 } return b; // 余数为0时的除数即为最大公约数 } int main() { int m, n; scanf("%d%d", &m, &n); int ret = gcd(m, n); printf("最大公约数为:%d\n", ret); return 0; } ``` **代码解析**: 1. 函数 `gcd` 通过 `while` 循环断更新被除数除数,直到余数为零。 2. 最终返回的 `b` 即为最大公约数[^2]。 #### 方法二:递归实现 ```c #include <stdio.h> int gcd_recursive(int a, int b) { if (b == 0) return a; // 基准条件 return gcd_recursive(b, a % b); // 递归调用 } int main() { int a, b; scanf("%d%d", &a, &b); printf("最大公约数为:%d\n", gcd_recursive(a, b)); return 0; } ``` **代码解析**: 1. 递归终止条件为 `b == 0`,此时 `a` 即为公约数2. 递归步骤将 `b` `a % b` 作为新参数传递。 --- ### 关键点说明 - **输入处理**:若输入数为负数,建议在函数内添加绝对处理(例如 `a = abs(a);`)。 - **效率优化**:循环实现避免了递归的栈溢出风险,更适合处理极大整数- **数学原理**:基于定理 $\gcd(a, b) = \gcd(b, a \bmod b)$,直至 $a \bmod b = 0$[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值