用C语言,在一个正整数的各数字中找出最小者
时间: 2024-02-11 15:08:22 浏览: 103
可以使用以下代码来实现:
```c
#include <stdio.h>
int main() {
int num, digit, min_digit = 9;
printf("请输入一个正整数:");
scanf("%d", &num);
while (num > 0) {
digit = num % 10;
if (digit < min_digit) {
min_digit = digit;
}
num /= 10;
}
printf("最小的数字是:%d\n", min_digit);
return 0;
}
```
程序首先提示用户输入一个正整数,然后通过循环逐个取出该数的每一位数字,并与当前记录的最小数字进行比较。如果该位数字小于当前记录的最小数字,则更新最小数字。最后输出最小数字即可。
相关问题
给我一个c语言求两个正整数的最小公倍数的代码
以下是C语言的代码:
```c
#include <stdio.h>
int main() {
int num1, num2, max;
printf("请输入两个正整数:");
scanf("%d %d", &num1, &num2);
max = (num1 > num2) ? num1 : num2;
while(1) {
if(max % num1 == 0 && max % num2 == 0) {
printf("%d和%d的最小公倍数为:%d", num1, num2, max);
break;
}
++max;
}
return 0;
}
```
该程序利用了循环和条件语句,先输入两个正整数,然后找出两个数中较大的一个作为循环终止条件,逐个检查这个数的倍数是否同时也是另一个数的倍数。找到第一个同时是两数倍数的数,即为它们的最小公倍数。
请用C语言给出一个时间上尽可能高效的算法,找出数组中未出现的最小正整数
下面是一个时间复杂度为 O(n) 的算法,用于找出数组中未出现的最小正整数:
```c
#include <stdio.h>
int findMissingPositive(int arr[], int length) {
// 将所有负数和零都设置为一个大于length的数,使其不影响结果
for (int i = 0; i < length; i++) {
if (arr[i] <= 0) {
arr[i] = length + 1;
}
}
// 标记已存在的正整数
for (int i = 0; i < length; i++) {
int num = abs(arr[i]);
if (num <= length) {
arr[num - 1] = -abs(arr[num - 1]);
}
}
// 找到第一个未标记的正整数
for (int i = 0; i < length; i++) {
if (arr[i] > 0) {
return i + 1;
}
}
// 如果数组中的所有正整数都已标记,则返回length+1
return length + 1;
}
int main() {
int arr[] = {3, 4, -1, 1};
int length = sizeof(arr) / sizeof(arr[0]);
int missingPositive = findMissingPositive(arr, length);
printf("数组中未出现的最小正整数为:%d\n", missingPositive);
return 0;
}
```
该算法的思路是通过遍历数组,将所有非正整数(负数和零)都设置为一个大于length的数,这样它们不会影响到最后的结果。然后,再次遍历数组,将出现的正整数对应的索引位置的数标记为负值。最后,再次遍历数组,找到第一个未标记的正整数,即为未出现的最小正整数。
在该算法中,通过遍历数组三次,实现了线性时间复杂度 O(n),其中 n 是数组的长度。
希望这个算法能满足您的需求!