<编程珠玑>向量旋转(旋转交换) 第三种方法实现代码, 杂耍,其实也没那么容易出错....

本文提出了一种简化向量旋转算法的方法,通过记录移动次数而非计算最小公倍数来实现循环结束,旨在提供更清晰易懂的代码实现。适用于相关学习者讨论与反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于再次看到之前自己分享的 关于 <编程珠玑> 里 向量旋转(旋转交换)的相关代码.  发现无人关注. 网络上搜索相关 实现代码,发现 又长又晦涩. 不易理解. 这里对之前的分享重新修改,最主要区别是,不计算最小公倍数,改用记录移动次数作为循环结束点.力求简单明了.希望有相关学习的同学发表自己的看法. 

/*转载请注明出处.*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void f(char*,int);

int main(int argc, char *argv[]) {
	char *a; /* 被操作的字符串 */
	int step; /* 移位位置 */

	if(argc < 3) {
		printf("%s%s%s\n", "usage: ", argv[0], " string number\n");
		return -1;
	}

	a = argv[1];
	step = atoi(argv[2]);

	f(a,step);
	printf("%s\n", a);
}


void f(char *a, int step){
	int i=0, j=0;
	int n; /* 字符串长度 */

	int tmp; /* 临时存储区域 */
	int movenum = 0; /* 总共移动次数 */

	n = strlen(a) / sizeof(char);
	step = step % n;
	if(!step) return;
	while(movenum < n) {
		tmp = a[i];
		j = i;
		while(((j+step)%n) != i) {
			a[j] = a[((j+step)%n)];
			movenum++;
			j = ((j+step)%n);
		}
		a[j] = tmp;
		movenum++;
		i++;
	}
	//printf("strlen: %d step: %d move: %d\n", n, step, movenum);
}
 
编码,学习, 都是辛苦活, 写文章,发共享,没人发工资. 请转载的朋友注明出处.  不要做伸手党.

转载于:https://my.oschina.net/u/246948/blog/148620

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值