C 练习实例68
题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。
程序分析:可以使用一个辅助数组来保存需要移动的元素,然后再将元素按照要求移动到正确的位置。
实例 1
#include <stdio.h>
// 通过 shiftArray 函数来实现数组元素的移动。
void shiftArray(int arr[], int n, int m) {
int temp[m];
// 保存最后 m 个数到临时数组
for (int i = n - m, j = 0; i < n; i++, j++) {
temp[j] = arr[i];
}
// 将前面的 n-m 个数向后移动 m 个位置
for (int i = n - m - 1; i >= 0; i--) {
arr[i + m] = arr[i];
}
// 将临时数组中的数放到最前面
for (int i = 0; i < m; i++) {
arr[i] = temp[i];
}
}
// 在 main 函数中获取用户输入的数组和要移动的位置,调用s hiftArray 函数,最后输出移动后的数组
int main() {
int n, m;
printf("请输入整数个数 n:");
scanf("%d", &n);
printf("请输入向后移动的位置 m:");
scanf("%d", &m);
int arr[n];
printf("请输入 %d 个整数:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
shiftArray(arr, n, m);
printf("移动后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
// 通过 shiftArray 函数来实现数组元素的移动。
void shiftArray(int arr[], int n, int m) {
int temp[m];
// 保存最后 m 个数到临时数组
for (int i = n - m, j = 0; i < n; i++, j++) {
temp[j] = arr[i];
}
// 将前面的 n-m 个数向后移动 m 个位置
for (int i = n - m - 1; i >= 0; i--) {
arr[i + m] = arr[i];
}
// 将临时数组中的数放到最前面
for (int i = 0; i < m; i++) {
arr[i] = temp[i];
}
}
// 在 main 函数中获取用户输入的数组和要移动的位置,调用s hiftArray 函数,最后输出移动后的数组
int main() {
int n, m;
printf("请输入整数个数 n:");
scanf("%d", &n);
printf("请输入向后移动的位置 m:");
scanf("%d", &m);
int arr[n];
printf("请输入 %d 个整数:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
shiftArray(arr, n, m);
printf("移动后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
实例 2
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[20];
int i,n,offset;
//输入数组大小和数组内容
printf("Total numbers?\n");
scanf("%d",&n);
printf("Input %d numbers.\n",n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
//输入滚动偏移量
printf("Set your offset.\n");
scanf("%d",&offset);
printf("Offset is %d.\n",offset);
//打印滚动前数组
print_arr(arr,n);
//滚动数组并打印
move(arr,n,offset);
print_arr(arr,n);
}
//打印数组
void print_arr(int array[],int n)
{
int i;
for(i=0;i<n;++i)
printf("%4d",array[i]);
printf("\n");
}
//滚动数组
void move(int array[],int n,int offset)
{
int *p,*arr_end;
arr_end=array+n; //数组最后一个元素的下一个位置
int last;
//滚动直到偏移量为0
while(offset)
{
last=*(arr_end-1);
for(p=arr_end-1;p!=array;--p) //向右滚动一位
*p=*(p-1);
*array=last;
--offset;
}
}
C 语言经典100例
banhuxun
ban***un@163.com
参考解法:
#include <stdio.h> void fun(int arr[],int m,int size); int main() { int i,j,a[100],n=0,m; char ch=0; printf("请输入一组整数:\n"); while(ch!='\n') { scanf("%d",&a[n++]); ch=getchar(); } printf("请输入向后移动几位:"); scanf("%d",&m); fun(a,m,n); printf("向后移动后:\n"); for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); return 0; } void fun(int arr[],int m,int size) { int i,j,k=0; int buf[size]; for(i=0;i<size;i++) { buf[i]=arr[i]; } for(i=0;i<m;i++) { arr[i]=arr[size-m+i]; } for(j=i;j<size;j++) { arr[j]=buf[k++]; } }banhuxun
ban***un@163.com
半折枯松
152***0570@qq.com
参考方法:
#include<stdio.h> #define N 100 void move (void); int main () { int i,a[N],n,m,j,k; printf ("请输入数组元素个数:n\n"); scanf("%d",&n); printf ("请输入后移几个元素\n"); scanf("%d",&m); printf("请输入一个数组n个元素\n"); for (i=0;i<n;i++) scanf("%d",&a[i]); i=n-1;j=n+m-1; while(i>=0) { a[j]=a[i]; j--; i--; } k=m-1;j=n+m-1; while(k>=0) { a[k]=a[j]; k--; j--; } printf("输出后移后的数组为:\n"); for (i=0;i<n;i++) printf("%5d ",a[i]); return 0; }半折枯松
152***0570@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> #define N 80 void reverse(int a[],int low,int high) { int i = low; int j = high; while(i < j) { if(i < j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } i++; j--; } } int main(void) { int n, m, a[N]; printf("需要输入几个数?\n"); scanf("%d",&n); printf("请输入%d个数:\n",n); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } printf("请输入移动位置大小:\n"); scanf("%d",&m); reverse(a,0,n - 1); reverse(a,0,n - m - 1); reverse(a,n - m,n - 1); for(int i = 0; i < n; i++) { printf("%d",a[i]); } return 0; }HIT_CCC
117***2963@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> #define N 80 void reverse(int a[],int low,int high) { int i = low; int j = high; while(i < j) { if(i < j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } i++; j--; } } int main(void) { int n, m, a[N]; printf("需要输入几个数?\n"); scanf("%d",&n); printf("请输入%d个数:\n",n); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } printf("请输入移动位置大小:\n"); scanf("%d",&m); reverse(a,0,n - 1); reverse(a,0,m - 1); reverse(a,m,n - 1); for(int i = 0; i < n; i++) { printf("%d ",a[i]); } return 0; }HIT_CCC
117***2963@qq.com
huanhuan
992***291@qq.com
参考方法(用两个数组实现):
#include<stdio.h> #include<stdlib.h> void main() { int a[100],b[100],m,n,i,j=0,k; printf("数组个数:"); scanf("%d",&n); k=n;//下面会用到 printf("请输入数组:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("请输入后移几位:"); scanf("%d",&m); for(i=n-m;i<n;i++) b[j++]=a[i];//先将a数组中的后m位记录到b数组中 for(i=n-m-1;i>=0;i--) a[--k]=a[i];//然后将a数组中没有记录到b数组的元素隔m-1个元素赋值到后面 for(i=0;i<j;i++) a[i]=b[i];//再将记录在b数组中的元素赋值给数组a的前面一部分 printf("结果如下:\n"); for(i=0;i<n;i++) printf("%3d ",a[i]);//输出的数组a为最终结果 putchar('\n'); system("pause"); }huanhuan
992***291@qq.com
zxw09y
444***701@qq.com
参考方法:
#include<stdio.h> #define MAX 20 void printf_s(int *,int ); void goright(int *, int ); void goright(int *a, int n) //向右位移一个数 { int temp = a[n-1]; for(int i = n - 1; i > 0 ; i--) { a[i] = a[i-1]; } a[0] = temp; } void printf_s(int *a, int n) { for(int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); } int main(void) { int n, m; int a[MAX]; printf("请设置数组长度(不超过20) : "); scanf("%d", &n); printf("请输入数组 : "); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } printf("请输入需要移动的数量 : "); scanf("%d", &m); while(m) { goright(a,n); m--; } printf_s(a,n); return 0; }zxw09y
444***701@qq.com
BakaCirno1001
341***2969@qq.com
#include<stdio.h> #include <sys/malloc.h> #define LEFT 1 #define RIGHT -1 #define compare(sign,m,n) ( (sign)>1? (m)>(n)?1:(m)==(n)?0:-1 : (m)>(n)?-1:(m)==(n)?0:1 ) #define ptarr(type,arr,n) { int i=0; printf("component:\n"); while(i<n) printf(#type"\t",arr[i++]); printf("\n");} #define initarr(arr,n,c) { int i=0; while(i<n) arr[i++]=c;} #define arrncopy(l,arr2,m,arr1,n) {int i=0,j=(m),k=(l); while(i<(n)) arr2[i+l]=arr1[i+j],i++;} //从 m 开始copy n 个 #if defined arrlen #undef arrlen #endif #define arrlen(str) ( (*(&str+1)-str) ) #define ARRLEN(str) ( sizeof(arr)/sizeof(*arr) ) #define arrmove(way,arr,m) {\ int size,step,start,i,j,n=(m),drct=0;\ drct = ( n<0 ? n=-n,-(way):(way) );\ size=arrlen(arr);\ step=drct>=0?1:-1;\ start=drct>=0?0:size-1;\ if( ((n)>0?(n):-(n)) >= size ) {initarr(arr,size,0);}\ else if(n==0) ;\ else{\ while((drct>=0?(start+(n)<size):(start-(n)>=0))){\ i = start;\ j = drct>=0 ? start+(n) : start-(n);\ arr[i]=arr[j];\ arr[j]=0;\ start+=step;\ }\ while( drct>=0?start<j:start>j ) {arr[start]=0;start+=step;}\ }\ } #define cirmove(type,way,arr,m) {\ int size,n1=(m);\ int drct1=(n1)<0?n1*=-1,-(way):(way);\ type *tarr;\ size=arrlen(arr);\ n1=(n1)%size;\ if( (tarr=(type *)malloc(n1*sizeof(type)))==NULL ) return 0;\ if(drct1>=0) {arrncopy(0,tarr,0,arr,n1);} else {arrncopy(0,tarr,size-n1,arr,n1);}\ arrmove(drct1,arr,n1);\ if(drct1>=0) {arrncopy(size-n1,arr,0,tarr,n1);} else {arrncopy(0,arr,0,tarr,n1);}\ } int main() { int i; int arr[10]={1,2,3,4,5,6,7,8,9,10}; ptarr(%d,arr,10); for(i=-11;i<11;i++) { cirmove(int,LEFT,arr,i); ptarr(%d,arr,10); cirmove(int,LEFT,arr,-i); getchar(); } }BakaCirno1001
341***2969@qq.com
BakaCirno1001
341***2969@qq.com
再用函数实现(方法有些复杂)
#include<stdio.h> #include<malloc.h> #define NUM 10 #define LEFT 1 #define RIGHT -1 #define ARRLEN(arr) ( sizeof(arr)/sizeof(*arr) ) #define PTARR(type,arr,n) {int i=0; printf("component:\n"); while(i<n)printf(#type"\t",arr[i++]); printf("\n");} #define voidcopy(pa,pb,size) {int asize=(size); while(--asize>=0) *((char*)(pa)+asize) = ( pb==NULL?0:*((char*)(pb)+asize) ) ; } void * arrmove(int direct,void *arr,int byte,int size,int n); void * cirmove(int direct,void *arr,int byte,int size,int n); int main() { int j; double arr[NUM]={1,2,3,4,5,6,7,8,9,10}; PTARR(%.3lf,arr,10); for(j=-11;j<12;j++) { cirmove(RIGHT,arr,sizeof(*arr),ARRLEN(arr),j); PTARR(%.3lf,arr,10); cirmove(RIGHT,arr,sizeof(*arr),ARRLEN(arr),-j); getchar(); } getchar(); return 0; } void * arrmove(int direct,void *arr,int byte,int size,int n) //方向: +:左 -:右 0:?? { if(direct) { int start,step; //起点,步长 int i,j; char *arri,*arrj; direct = n>0 ? direct : -direct; //方向变换 n = n>0 ? n : -n; //n取绝对值 start = direct>0 ? 0 : size-1;//起点,左移为0 step = direct>0 ? 1 : -1;//步长,左移为1 while(start<size && start>=0) { i = start; j = direct>0 ? i+n : i-n; arri=(char*)arr+byte*i; arrj=(char*)arr+byte*j; if(direct>0) { if(j<size) //arr[j]存在就赋值给arr[i] { voidcopy(arri,arrj,byte); voidcopy(arrj,NULL,byte); } //不存在就把0赋值给arr[i] else voidcopy(arri,NULL,byte); } //类比:arr[i]=arr[j]; else { if(j>=0) { voidcopy(arri,arrj,byte); voidcopy(arrj,NULL,byte); } else voidcopy(arri,NULL,byte); } start+=step; } return arr; } return NULL;//无方向 } void * cirmove(int direct,void *arr,int byte,int size,int n) //方向: +:左 -:右 0:?? { if(direct) { int start,step; //起点,步长 int i,j,st1,sp1; char *str,*arri,*arrj;; direct = n>0 ? direct : -direct; //方向变换 n = n>0 ? n : -n; //n取绝对值 n%=size; //循环 取余 if(n==0) return arr; //提前终止 str=(char*)malloc(size*n); start = direct>0 ? 0 : size-1;//起点,左移为0 st1 = direct>0 ? 0 : n-1; step = direct>0 ? 1 : -1;//步长,左移为1 sp1 = direct>0 ? 1 : -1; while(direct>0 ? st1<n : st1>=0) { i=st1; j=start; arri=(char*)str+byte*i; arrj=(char*)arr+byte*j; voidcopy(arri,arrj,byte); st1+=sp1; start+=step; }//复制 arrmove(direct,arr,byte,size,n); /*------位移-----*/ start = direct>0? size-n : 0; for(st1=0;st1<n;st1++,start++) { i=start; j=st1; arri=(char*)arr+byte*i; arrj=(char*)str+byte*j; voidcopy(arri,arrj,byte); }//粘贴 return arr; } return NULL;//无方向 }BakaCirno1001
341***2969@qq.com
Darkbird00x0
107***4459@qq.com
初学者编写,借助其他两个数组存储并重新赋元素,代码比较好理解。
#include <stdio.h> void main() { int m,i,j,k,r, n; int a[20]; int b[20]; int c[20]; printf("请输入整数的个数(<20):"); scanf("%d", &n); printf("请输入向后移位数(<=n):"); scanf("%d", &m); printf("请输入数组:\n"); for (i = 0; i < n; i++) { scanf("%d", &a[i]); } for (i = 0; i < m; i++) { b[i] = a[n - m + i]; } for (j = 0; j < n - m; j++) { c[j] = a[j]; } for (k = 0; k < m; k++) { a[k] = b[k]; } for (r = 0; r < n - m; r++) { a[r + m] = c[r]; } printf("移位后的数组为:\n"); for (i = 0; i < n; i++) { printf("%d ", a[i]); } }Darkbird00x0
107***4459@qq.com
kleeper
845***161@qq.com
利用malloc创建两个动态数组
//有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数。 #include <iostream> #include <malloc.h> using namespace std; int main() { int n = 0; int m = 0; cin >> n; int *p = (int*)malloc(n * sizeof(n));//动态数组 for (int i = 0; i < n; i++) { scanf_s("%d", p + i); } cin >> m; int* p1 = (int*)malloc(m * sizeof(m));//创建长度为m的动态数组,存放移动后放在首部的m个数字 for (int j = 0; j < m; j++) { int* temp = p1 + j; temp = p + (n - m + j); cout << *temp << " "; } //创建长度为(n - m)的数组,存放移动后放在p1代表的数组后的(n - m)个数字 int* p2 = (int*)malloc((n - m) * sizeof(int)); for (int i = 0; i < n - m; i++) { int* temp = p2 + i; temp = p + i; cout << *temp << " "; } return 0; }kleeper
845***161@qq.com
gitm2lin
197***4269@qq.com
用 2 个数组实现,原理类似补码原理,得到新位置索引后,直接赋值即可:
#include <stdio.h> /* 题目:有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。 思路:用取模的思路,补码原理,2个数组实现 */ //print数组 void print(char *str,int *nums, int size) { while (*str) { printf("%c",*str); str++; } printf("["); for (int i = 0; i < size; i++) { printf("%d", *(nums + i)); if (i != size - 1) { printf(","); } } printf("]\n"); } int main() { int n = 5; int m = 3; int nums[20] = {1, 2, 3, 4, 5}; int nums_c[20] = {0}; // 指针交换 int *st1 = nums; // int *ed1 = st1 + n - 1; int *st2 = nums_c; // int *ed2 = st2 + n - 1; // printf("%d %d\n", *st1, *ed1); // 理论:1 5 int index; for (int i = 0; i < n; i++) { //移动后的索引位置:index=i+m>4?i+m:(i+m)%n; index=(i+m<4)?i+m:(i+m)%n; // printf("%d\n",index); //将旧数组数移动到新数组 *(st2+index)=*(st1+i); } print("移动前数组:",nums,n); print("移动后数组:",nums_c,n); return 0; }结果:
gitm2lin
197***4269@qq.com