文章目录
- 题目描述:用连续自然数之和来表达整数
- 输入描述
- 输出描述
- 用例1
- 说明
- 用例2
- 代码
- 运行举例
- 注意:
- 1、sprintf 和 strcat区别
- 2、qsort
题目描述:用连续自然数之和来表达整数
一个整数可以由连续的自然数之和来表示。
给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式
输入描述
一个目标整数T (1 <=T<= 1000)
输出描述
该整数的所有表达式和表达式的个数。如果有多种表达式,输出要求为:
自然数个数最少的表达式优先输出
每个表达式中按自然数递增的顺序输出,具体的格式参见样例。
在每个测试数据结束时,输出一行”Result:X”,其中X是最终的表达式个数。
用例1
输入
9
输出
9=9
9=4+5
9=2+3+4
Result:3
说明
整数 9 有三种表示方法,第1个表达式只有1个自然数,最先输出,
第2个表达式有2个自然数,第2次序输出,
第3个表达式有3个自然数,最后输出。
每个表达式中的自然数都是按递增次序输出的。
数字与符号之间无空格
用例2
输入
10
输出
10=10
10=1+2+3+4
Result:2
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char ch[1000];
int length;
} set;
int compare(const void *a, const void *b) {
return ((set *)a)->length - ((set *)b)->length;
}
int main() {
int target;
scanf("%d", &target);
printf("%d=%d\n", target, target); // 输出目标整数本身的表达式
set res[1000]; // 存储所有表达式的数组
int cnt = 0; // 表达式的数量
// 枚举从 1 开始的连续自然数的个数
for (int i = 1; i < target; i++) {
int sum = 0;
char temp[1000] = ""; // 临时存储每个表达式的字符串
// 从第 i 个自然数开始累加
for (int j = i; sum < target; j++) {
sum += j;
char num[10];
sprintf(num, "%d+", j); // 将数字转换为字符串,并添加"+"符号
strcat(temp, num);
// 找到一个表达式
if (sum == target) {
temp[strlen(temp) - 1] = '\0'; // 去掉最后的"+"符号
sprintf(res[cnt].ch, "%d=%s", target, temp);
res[cnt].length = j - i + 1;
cnt++;
break;
}
}
}
qsort(res, cnt, sizeof(set), compare);
for (int i = 0; i < cnt; i++) {
printf("%s\n", res[i].ch);
}
// 输出表达式的个数
printf("Result:%d\n", cnt + 1);
return 0;
}
运行举例
注意:
1、sprintf 和 strcat区别
sprintf
和 strcat
都是 C 语言中处理字符串的函数,但它们在功能和用法上有着明显的区别:
-
sprintf():
- 函数原型:
int sprintf(char *str, const char *format, ...);
- 功能:将格式化的数据写入到一个字符数组(即字符串)中。类似于
printf()
函数,但不是输出到标准输出设备,而是存储到指定的缓冲区。 - 使用场景:可以用于生成或格式化字符串,其中字符串可以包含各种类型的变量值,如整数、浮点数、字符串等,并且可以在一次调用中连接多个字符串或其他类型的数据。
示例:
char buffer[100]; int number = 42; char name[] = "Alice"; sprintf(buffer, "Number: %d, Name: %s", number, name);
这行代码会将格式化的字符串存入
buffer
中,内容为"Number: 42, Name: Alice"
。 - 函数原型:
-
strcat():
- 函数原型:
char *strcat(char *dest, const char *src);
- 功能:将源字符串
src
的内容追加到目标字符串dest
的末尾,不进行任何形式的格式化。 - 使用场景:主要用于拼接两个已知的字符串,只能处理字符串类型的数据,并且要求目标字符串有足够的空间来容纳源字符串以及原来的字符串内容和结束符
\0
。
示例:
char str1[50] = "Hello, "; char str2[] = "World!"; strcat(str1, str2);
这行代码会将
"World!"
追加到"Hello, "
后面,形成新的字符串"Hello, World!"
。 - 函数原型:
总结:
sprintf
主要用于格式化并生成字符串,支持多种数据类型的转换和插入;strcat
则专注于简单的字符串拼接,只针对字符串进行操作,且不涉及任何格式化转换。
2、qsort
qsort()
是 C 语言标准库中提供的一个通用排序函数,用于对任何类型的数组进行快速排序。其原型定义在 <stdlib.h>
头文件中:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
base
:指向待排序数组的首元素的指针。nmemb
:数组中需要排序的元素个数。size
:每个元素的大小(以字节为单位)。compar
:指向比较函数的指针,该函数接收两个参数,都是指向数组元素的指针,并返回一个整数值。如果第一个参数应该排在第二个之前,则返回负数;如果两个参数相等则返回零;如果第一个参数应该排在第二个之后,则返回正数。
示例:
假设有一个整数数组需要排序:
#include <stdio.h>
#include <stdlib.h>
int compare_ints(const void *a, const void *b) {
const int *ia = (const int *)a;
const int *ib = (const int *)b;
return (*ia > *ib) - (*ia < *ib); // 或者简单地写成 return (*ia - *ib);
}
int main() {
int arr[] = {5, 2, 9, 1, 5, 6};
size_t n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare_ints);
for (size_t i = 0; i < n; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
//输出 1 2 5 5 6 9
return 0;
}
在这个例子中,compare_ints
函数是一个自定义的比较函数,它负责比较两个整数并根据结果返回相应的值。qsort()
则会使用这个比较函数来决定如何对数组进行排序。