整数反转
main函数部分
我们可以在函数中通过用户自定义的函数 num_reverse 来实现整数的反转
main函数部分,定义并输入我们需要的整数,以及存储反转过后的整数的reverse函数
int main(){
int number = 0;
scanf("%d", &number);
int reverse = num_reverse(number);//reverse存储反转函数num_reverse的值
peintf(" The reverse number of the %d is %d ", number , reverse);
rerurn 0;
}
定义初始化的number,用户可以自己输入一串数字
此时,再通过外部函数reverse_num来实现数字反转的操作
num_reverse函数部分
int num_reverse(int num){
int reverse_num = 0;
while (num != 0){
reverse_num = num % 10 + reverse_num * 10;//这一步是最关键的操作,通过将用户输入的数字进行取余再加给reverse_num ,再将reverse进一位,再次进行取余,最终实现整串数字的反转
num /= 10;
}
return reverse_num;
}
while(num!= 0)
这个循环条件的作用是,只要传入的参数num
的值不为 0,就持续执行循环体内容。因为当num
变为 0 时,意味着已经将原数字的每一位都处理完了,可以结束反转操作了。
- 在循环体中:
reverse_num = num % 10 + reverse_num * 10;
这行代码是核心的反转操作步骤。num % 10
可以获取到num
当前的个位数字(例如,对于数字123
,第一次执行时123 % 10
得到3
),然后将reverse_num
乘以 10(相当于将之前已经得到的反转数字整体左移一位,为添加新的个位数字腾出位置),再加上新获取的个位数字,就实现了将原数字的个位数字添加到reverse_num
的最低位,逐步构建反转后的数字。例如,第一次循环时reverse_num
从 0 变为 3,第二次循环如果原数字是123
,此时num
变为12
,12 % 10
得到2
,reverse_num
就变为3 * 10 + 2 = 32
,依此类推。num /= 10;
这行代码是将num
去掉已经处理过的个位数字,例如对于123
,执行一次后num
就变为12
,继续下一轮循环处理新的个位数字,直到num
的值变为 0 为止。
- 最后,当
while
循环结束后,reverse_num
中存储的就是原数字反转后的结果,通过return reverse_num;
将这个反转后的数字返回给调用者。
完整代码
//数字反转
#include<stdio.h>
int num_reverse(int num){
int reverse_num = 0;
while(num != 0){
reverse_num = num % 10 + reverse_num * 10;
num /= 10;
}
return reverse_num;
}
int main(){
int number = 0;
scanf("%d", &number );
int reverse = num_reverse(number);
printf("The reverse number of the %d is %d", number , reverse);
return 0;
}
当然,也可能会存在输入数字过长的问题,当超过int类型所表示的范围,用户可以考虑换用longlong类型来表示更大的范围
数组反转
main函数部分
int main(){
int i;
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr)/sizeof(arr[0]);
int reverse = num_reverse(arr, size);
for(i = 0; i < size; i++){
printf("%d", arr[i]);
}
return 0;
}
- 数组定义与大小计算:
- 在
main
函数开头,定义了一个整数数组arr
,并初始化其元素为{1, 2, 3, 4, 5}
。 - 接着通过
int size = sizeof(arr)/sizeof(arr[0]);
来计算数组的大小。sizeof(arr)
表示整个数组所占的字节数,sizeof(arr[0])
表示数组中单个元素所占的字节数(对于int
类型元素的数组,sizeof(arr[0])
就是sizeof(int)
),两者相除就得到了数组中元素的个数,也就是数组的大小。在这个例子中,数组arr
有 5 个元素,通过这种方式可以准确获取其大小,并且这种方式在数组元素个数改变时也能正确计算出数组大小,比较灵活。
- 在
- 函数调用与数组反转操作:
num_reverse(arr, size);
这行代码调用了前面定义的num_reverse
函数,将定义好的数组arr
和计算得出的数组大小size
作为参数传递进去,从而在num_reverse
函数内部对数组arr
的元素顺序进行反转操作。
- 数组元素输出:
- 通过一个
for
循环for (int i = 0; i < size; i++)
,循环变量i
从 0 开始,每次递增 1,直到i
的值小于数组大小size
。在循环体中,使用printf("%d ", arr[i]);
将数组中每个元素的值输出到屏幕上,每个元素之间用空格隔开,这样就展示出了反转后的数组元素内容。例如,经过前面的反转操作后,输出的内容就是5 4 3 2 1
。
- 通过一个
num_reverse函数部分
int num_reverse(int arr[], int size){
int start = 0;
int end = size - 1;
while(start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start ++;
end --;
}
}
- 函数定义与参数:
- 函数名为
num_reverse
,它的返回类型是void
,意味着这个函数执行完相应操作后不会返回一个具体的值,而是通过修改传入的数组来达到目的。 - 函数接受两个参数,一个是
int arr[]
,它表示一个整数数组,在 C 语言中,这样写实际上传递的是数组的首地址,也就是通过指针的方式来操作数组元素。另一个参数int size
表示数组的大小,用于确定循环的边界范围等操作。
- 函数名为
- 变量定义(
start
和end
):- 在函数内部,首先定义了两个整型变量
start
和end
。start
初始化为 0,它将作为数组的起始索引,用于从数组头部开始进行交换操作。end
初始化为size - 1
,它代表数组的末尾索引,用于从数组尾部开始进行交换操作。例如,如果数组大小size
为 5,那么end
初始值就是 4,对应数组中最后一个元素的下标。
- 在函数内部,首先定义了两个整型变量
while
循环逻辑:while (start < end)
是整个交换操作的核心循环控制条件。只要start
的值小于end
的值,就意味着数组中间还有元素没有完成交换,需要继续循环执行交换操作。- 在循环体内部:
int temp = arr[start];
这行代码首先定义了一个临时变量temp
,并将当前start
索引位置对应的数组元素值(也就是数组头部的元素值)赋给temp
,用于暂存这个值,避免在后续交换过程中数据丢失。例如,对于数组{1, 2, 3, 4, 5}
,第一次循环时temp
会被赋值为 1。arr[start] = arr[end];
这行代码将数组末尾索引(end
)位置对应的元素值赋给当前头部索引(start
)位置的元素,实现了一次交换操作的一半。继续上面的例子,此时数组就变成了{5, 2, 3, 4, 5}
(第一个元素 1 被替换成了最后一个元素 5)。arr[end] = temp;
这行代码再将之前暂存在temp
变量中的原头部元素值赋给末尾索引(end
)位置对应的元素,完成了一次完整的元素交换。对于上述例子,数组最终变为{5, 2, 3, 4, 1}
,实现了数组头部和尾部元素的交换。start++;
和end--;
这两行代码分别将start
的值加 1,end
的值减 1,使它们向数组中间靠拢,准备下一轮的元素交换操作。例如,下一轮循环时,start
变为 1,end
变为 3,就会对数组中间的元素进行交换,以此类推,直到start
不再小于end
,表示整个数组的元素都已经完成了两两交换,数组元素顺序也就实现了反转。
完整代码
#include<stdio.h>
int num_reverse(int arr[], int size){
int start = 0;
int end = size - 1;
while(start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start ++;
end --;
}
}
int main(){
int i;
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr)/sizeof(arr[0]);
int reverse = num_reverse(arr, size);
for(i = 0; i < size; i++){
printf("%d", arr[i]);
}
return 0;
}