目录
有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
1.1
1162:题目描述
有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
题目没有告诉你n的范围,希望你读入n之后用malloc()函数动态申请内存空间,不要提前定义数组的大小。不要偷懒哦。
另外要求定义并使用函数ringShift()
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
}
输入
输入分3行,第一行是一个整数n,第二行是n个整数,用空格隔开。第三行是一个整数k。
输出n个整数,由空格隔开。输出占一行。
1.2
答案:
#include <stdio.h>
#include <stdlib.h>
void fx(int p[],int n,int m);
int main()
{
int n,m,i,*p;
scanf("%d",&n);
p=(int *)malloc(n*sizeof(int));//指针*p指向数组p
for(i=0; i<n; i++)
scanf("%d",p+i);
scanf("%d",&m);
fx(p,n,m);
for(i=0; i<n; i++)
printf("%d ",p[i]);
return 0;
}
void fx(int p[],int n,int m)
{
int i,j,t;
for(i=0; i<m; i++) //循环m次,代表移动m次
{
t=p[n-1]; //保存最后一个
for(j=n-2; j>=0; j--) //把前面n-1个 从最后一个开始,赋值到下一个位置,循环n-1次
p[j+1]=p[j];
p[0]=t; //第一个位置赋值为(保存的最后一个)。
}
}
ps:
思路:
每次 先保存最后一个,再把前面n-1个从最后一个开始,赋值到下一个位置,
再把第一个位置赋值为(保存的最后一个)。
关于malloc函数:
malloc与new 函数
new 返回指定类型的指针,并且可以自动计算所需要大小。例如:
int *p;
p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
malloc 则必须由我们计算需要字节数(sizeof(int))
(sizeof(),括号内为变量类型,该函数将自动翻译为类型所对应的字节数,例如sizeof(int)=4字节)
,并且在返回后强行转换为实际类型的指针。((强行转化类型 *))
int* p;
p = (int *) malloc (sizeof(int));
或
p = (int *) malloc ( sizeof(int) * 100 );// 申请出一段连续的内存
第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。
第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:
int* p = (int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。
p = (int *) malloc (sizeof(int)); == p = (int *) malloc (4);
malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
具体解析如下链接: