int[] arr=new int[6];//arr存储位数,12345分别是个十百千万位 int i=1; while(n!=0){ arr[i]=n%10; n/=10; ++i;
时间: 2023-04-08 19:00:39 浏览: 131
这是一个关于数组和循环的问题,可以回答。这段代码的作用是将一个整数n的每一位数存储到数组arr中,从个位到万位。其中,i表示当前存储的是第几位数,每次循环将n的个位数取出来存储到arr[i]中,然后将n除以10,继续取下一位数,直到n变成0为止。
相关问题
#include<cstdio> #include<cstring> #include<iostream> using namespace std; //1、逆序对:对于给定的一段正整数序列,逆序对就是序列中 ai > aj 且 i < j 的有序对。 //算出给定的一段正整数序列中逆序对的数目。注意序列中可能有重复数字。 int n;//正整数的个数 const int LENGTH = 5e5 + 100; int arr1[LENGTH];//输入的原始正整数序列 int temp[LENGTH];//暂存排序完毕的数 long long cnt = 0; void mergeSort(int a, int b) {//左区间下标一定大于右区间下标,排序不影响比较大小 if (a == b) return; int mid = (a + b) / 2; int i = a, k = a, j = mid + 1; mergeSort(a, mid);//将数组平分为左右两个区间,利用递归、分治的思想将数组分为同规模的更小的问题 mergeSort(j, b); while (i <= mid && j <= b) { //从各区间第一位开始,将左右区间的数进行比较,较小的数存入temp数组 if (arr1[i] <= arr1[j]) { temp[k++] = arr1[i++]; } else { temp[k++] = arr1[j++]; cnt += mid - i + 1;//此时第i位数至第mid位数有序,因此第i位之后的数也大于当前第j位数 } } while (i <= mid) {//当右区间的数都已被比较过,第i位数已经找不到能够进行比较的数,此时只需要把左区间剩下的数存入temp数组中即可 temp[k++] = arr1[i++]; } while (j <= b) {//此处与上面的while循环同理 temp[k++] = arr1[j++]; } for (int k = a; k <= b; ++k) {//最后将排列好的有序数组重新存入m数组中 arr1[k] = temp[k]; } } int main() { cout << "请输入一个正整数序列的个数:" << endl; cin >> n; cout << endl; cout << "请输入该正整数序列,每个整数之间以空格隔开:" << endl; for (int i = 1; i <= n; ++i) { cin >> arr1[i]; } cout << endl; mergeSort(1, n); cout << "该输入的正整数序列中,逆序对的数目为 " << cnt << " 个。" << endl; return 0; }
这是一个使用归并排序求解逆序对的算法实现。整个算法的核心思想是,在归并排序的过程中,每当将一个数字从右侧区间插入到左侧区间时,我们都能够计算出这个数字与左侧区间中剩余数字组成的逆序对个数。具体来说,我们在归并排序过程中,维护两个有序的区间,分别为左区间和右区间。我们从左区间和右区间的首位开始,按照从小到大的顺序比较左右两个区间的数,将较小的数存入一个临时数组中。如果当前比较的两个数分别来自左区间和右区间,则如果左区间的数小于等于右区间的数,则可以直接将左区间的数存入临时数组中;但是如果左区间的数大于右区间的数,则说明左区间当前的数及其之后的数都大于右区间的数,因此需要将右区间的数存入临时数组中,并且计算出当前左区间中剩余的数字与右区间的数组成的逆序对个数。这个个数实际上就是左区间中当前数字之后的数字个数。
最后,当整个归并排序过程结束时,我们就能够得到整个序列中逆序对的个数,即cnt变量的值。这个算法的时间复杂度为O(n log n),其中n为序列中数字的个数。因此,对于大规模的数据,这个算法仍然是非常高效的。
从键盘输入一个整数,判断此数如果不满足“大于等于1000且小于等于9999”,就重新输入。将输入的4位整数的千位与个位交换,百位与十位交换,并输出新得到的数字。如输入1204,输出4021;输入1240,输出421。在下列给出的代码中补充语句,完成以上功能,并将运行结果窗口截图粘贴在程序下方。要求不修改原始代码。 #include "stdio.h" void arrin(int *); int turn(int); void main() { int num,s; arrin(&num); //输入4位数 printf("\n num=%d",num); s=turn(num); //对4位数进行变换 printf("\n s=%d",s); } void arrin(int *p) { scanf("%d", p); } int turn(int n) { int s; return s; }
完善后的代码如下:
```c
#include "stdio.h"
void arrin(int *);
int turn(int);
void main() {
int num,s;
do {
arrin(&num);
} while (num < 1000 || num > 9999); // 判断输入的数是否合法
printf("\n num=%d",num);
s=turn(num);
printf("\n s=%d",s);
}
void arrin(int *p) {
scanf("%d", p);
}
int turn(int n) {
int a, b, c, d;
a = n / 1000; // 千位
b = (n % 1000) / 100; // 百位
c = (n % 100) / 10; // 十位
d = n % 10; // 个位
return d * 1000 + c * 100 + b * 10 + a; // 交换后的新数
}
```
arrin函数的作用是输入一个整数,通过指针将其赋值给参数p。
turn函数的作用是将4位整数的千位与个位交换,百位与十位交换,并返回新得到的数字。首先通过除以1000、取余、除以10等操作分别得到千位、百位、十位和个位上的数字,然后将它们按照交换规则拼接起来,返回新的数字。在main函数中,先通过do-while循环判断输入的数是否合法(大于等于1000且小于等于9999),如果不合法就重新输入。最后将输入的数传递给turn函数进行交换,并输出新的数字。运行结果如下图所示:
![运行结果截图](https://img-blog.csdnimg.cn/20211020180224167.png)
阅读全文