有n个整数,使其前面各数按顺序向后移动m个位置,最后m个数变成最前面的m个数

题目描述:有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输不进去,是哪里错了呢

img

如有帮助 请点个采纳~

#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]越界了
所以后面的循环都不执行,直接退出了

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7750220
  • 这篇博客你也可以参考下:C语言题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
  • 除此之外, 这篇博客: 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数中的 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面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的数字从后往前依此移动,原因在于内存重叠

  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析: 根据参考资料中的代码,输入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;
    }
    

    如果还有其他问题,请提供更多信息以便进行进一步分析和解决。