题目描述:有n个整数,使其前面各数按顺序向后移动m个位置,最后m个数变成最前面的m个数
#include<stdio.h>
#define M 100
void main()
{
int n=0,m,a[M],i,b[M],j;
printf("请输入n个整数:\n");
scanf("%d",&a[M]);
printf("需要向后移动m位:\n");
scanf("%d",&m);
for(i=0;a[i]!='\0';i++)
n++;
for(i=n-m;i<n;i++)
for(j=0;j<=m-1;j++)
b[j]=a[i];
for(i=0;i<n-m;i++)
for(j=m;j<n;j++)
b[j]=a[i];
for(i=0;i<n;i++)
printf("%3d",b[M]);
return;
}
m输不进去,是哪里错了呢
如有帮助 请点个采纳~
#include <stdio.h>
#define M 100
int main()
{
int n = 0, m, a[M], b[M], i, j;
printf("请输入n个整数:\n");
scanf("%d", &n);
printf("请输入需要向后移动m位:\n");
scanf("%d", &m);
printf("请输入%d个整数:\n", n);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < m; i++)
{
b[i] = a[n - m + i];
}
for (i = 0; i < n - m; i++)
{
b[m + i] = a[i];
}
printf("移动后的数组:\n");
for (i = 0; i < n; i++)
{
printf("%3d", b[i]);
}
return 0;
}
第6 7 行,输入 n 个整数,先是输入 n ,scanf("%d", &n); 然后需循环输入数组的各个元素,for(i= 0;i < n;i++) scanf("%d", &a[i]);
1.你的n是0,代码里根本没有对n进行赋值
2.你的scanf都不在循环里,所以一共只赋值了2次
3.a[M]越界了
所以后面的循环都不执行,直接退出了
如图所示:
首先我们需要知道如何实现的算法:
1.我们将要把m单独拿出存储在一个数组中,才能使n-m的数字往后移
2.将n-m的数字从后往前依此移动
3.最后把m的值放入前面
#include<stdio.h>
#include<stdlib.h>
void Move(int *arr,int n,int m)
{
if(m<0 || m>=n)
{
return ;
}
int *brr = (int *)malloc(m*sizeof(int));
int i;
for(i=0;i<m;i++) //将后面的数据复制下来
{
brr[i] = arr[n-m+i];
}
//将前面的数据后移,先移动后面的数据
for(i=n-m-1;i>=0;i--)
{
arr[i+m] = arr[i];
}
//将brr中的数据复制到arr中
for(i=0;i<m;i++)
{
arr[i] = brr[i];
}
free(brr);
}
void Show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
Move(arr,sizeof(arr)/sizeof(arr[0]),3);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
可能你们会问为什么n-m的数字从后往前依此移动,原因在于内存重叠
问题分析: 根据参考资料中的代码,输入m的值是通过scanf函数进行输入的,所以无法正确输入m的值有可能是以下几个原因: 1. 输入m的时候格式出错,比如输入了非数字字符。 2. 输入m的时候超出了变量m的范围。
解决方案: 1. 确保在输入m的时候只输入数字字符。 2. 检查变量m的范围是否合理,即确保输入的m在合适的范围内。
代码示例:
// 从键盘输入m的值,并进行类型检查
int m;
if(scanf("%d", &m) != 1) {
printf("请输入正确的数字。\n");
return 0;
}
// 检查m的范围是否合理
if(m < 0 || m > n) {
printf("请输入合适的m的值。\n");
return 0;
}
如果还有其他问题,请提供更多信息以便进行进一步分析和解决。