|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:
#include <stdio.h>
int main(void)
{
int n,i,t;//n为 输入个数,t为移动距离
int a[100];
scanf("%d %d",&n,&t);
t %= n;//防止t比n大
for(i=0;i<n;i++)
{
scanf("&d",&a[i]);
}
for(i = (n - t);i < n;i++)
{
printf("%d",a[i]);
}
for(i = 0;i < (n - t) ;i++)
{
printf("%d",a[i]);
}
}
请问这个程序有什么问题,谢谢大佬。
本帖最后由 jackz007 于 2022-3-5 00:24 编辑
没有什么好神奇的,当 n = 6 的时候,a[] = {1 , 2 , 3 , 4 , 5 , 6},如果 m = 2,那么,经过移动以后的 a[] = {5 , 6 , 1 , 2 , 3 , 4},只要确定移动后的 a[0] = 5,那么,就按从小到大依序向 a[] 中填入 6 个数值,a[] = {5 , 6 , 7 , 8 , 9 , 10},但是,我们知道,a[] 中没有数值超过 6 的元素,所以,还需要为所有数值超过 6 的元素减掉 6 ,这样,我们就得到了 a[] = {5 , 6 , 1 , 2 , 3 , 4}。
2 楼的代码已经重新优化,与本解题思路相一致。
下面是递归函数版本的代码
- #include <stdio.h>
- void move(int d[] , int n , int m , int c)
- {
- int i , k ;
- if(n > m) {
- if(c < m) {
- k = d[n - m + c] ;
- move(d , n , m , c + 1) ;
- d[c] = k ;
- } else {
- for(i = 0 ; i < n - m ; i ++) d[n - 1 - i] = d[n - m - 1 - i] ;
- }
- }
- }
- int main(void)
- {
- int a[100] , i , m , n ;
- scanf("%d%d" , & n , & m) ;
- if(n > m && m > 0) {
- for(i = 0 ; i < n ; i ++) a[i] = i + 1 ;
- move(a , n , m , 0) ;
- for(i = 0 ; i < n ; i ++) {
- if(i) printf(" ") ;
- printf("%d" , a[i]) ;
- }
- }
- }
复制代码
编译、运行实况
- D:\[00.Exerciese.2022]\C>g++ -o k k.c
- D:\[00.Exerciese.2022]\C>k
- 100 10
- 91 92 93 94 95 96 97 98 99 100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
- D:\[00.Exerciese.2022]\C>k
- 6 2
- 5 6 1 2 3 4
- D:\[00.Exerciese.2022]\C>k
- 100 99
- 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 1
- D:\[00.Exerciese.2022]\C>
复制代码
这个代码也是整体只移动了一次。
|
|