Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63545
  • 博文数量: 7
  • 博客积分: 347
  • 博客等级: 二等列兵
  • 技术积分: 127
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-26 17:18
个人简介

一句话介绍是什么?

文章分类

全部博文(7)

分类: C/C++

2011-01-26 18:01:32

给你一个字符串str, 给你一个位置flag,把位置flag后的字串搬到这个字符串的开头
比如str[] = abcdefg 如果flag = 4,那么结果就是 efgabcd.
条件:不允许直接或间接使用任何的额外的变量。

 

  1. #include <stdio.h>

  2. char str[] = "1234567890";
  3. int flag = 5;

  4. void func (void);

  5. int main
  6. (void) {

  7.         func ();
  8.         
  9.         str[sizeof (str) - 1] = '\0'; /*字符串总是以NUL结尾*/
  10.         printf ("%s\n", str);
  11.         
  12.         puts ("\nPress ENTER to exit...\n");
  13.         getchar ();

  14.         return 0;
  15. }

  16. void func
  17. (void) {

  18.         /*如果没有交换到字符串最后*/
  19.         if ((sizeof (str) - 1) != (flag + str[sizeof (str) - 1])) {
  20.                 /*利用位操作交换str[i]和str[flag+i]*/
  21.                 /*字符串最后的NUL作计数器i*/
  22.                 str[str[sizeof (str) - 1]] ^= str[flag + str[sizeof (str) - 1]]; /*两个变量进行异或杂交*/
  23.                 str[flag + str[sizeof (str) - 1]] ^= str[str[sizeof (str) - 1]]; /*从杂交体提纯*/
  24.                 str[str[sizeof (str) - 1]] ^= str[flag + str[sizeof (str) - 1]]; /*提纯*/
  25.                 ++str[sizeof (str) - 1]; /*自增计数器*/
  26.                 func (); /*递归处理*/
  27.         } else {
  28.                 return;
  29.         }
  30. }
阅读(2322) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

shell_way2011-02-12 18:02:01

caoxudong818: 也给你拜晚年。祝你高考成功。
该题我也慢慢想想,比较有意思。
推荐一题:
“打印1到1000的整数,不能使用流程控制语句(for,while,goto等)也不能使用递归”
比较.....
绞尽脑汁想不出来,我只好作弊了。。。

#include <stdio.h>

#define PRINT   A;A;A;A;A;A;A;A;A;A;
#define A       B;B;B;B;B;B;B;B;B;B;
#define B       C;C;C;C;C;C;C;C;C;C;
#define C       printf ("%d\n&quo

caoxudong8182011-02-12 16:47:29

shell_way: 嗯,这真是个问题,我也不知道有什么解决方案,看来今后还是别进TX了 ;p
如果说类似作弊手段的方案,倒是可以让用户输入字串,在程序内部define 偏移,然后对st.....
也给你拜晚年。祝你高考成功。
该题我也慢慢想想,比较有意思。
推荐一题:
“打印1到1000的整数,不能使用流程控制语句(for,while,goto等)也不能使用递归”
比较好玩。

shell_way2011-02-12 15:54:18

caoxudong818: 对lz的程序提个问题,当
char str[] = "abcdefghijk";
int flag = 4 ;
时,
打印的结果是“efghijkdabc”,而不是“efghijkabcd”,似乎与题意并不相.....
嗯,这真是个问题,我也不知道有什么解决方案,看来今后还是别进TX了 ;p
如果说类似作弊手段的方案,倒是可以让用户输入字串,在程序内部define 偏移,然后对stdin 进行操作,putc 偏移之后的部分到EOF,把偏移+1 置NUL 然后putc 出0~偏移的部分,不过要求中又说要“搬到”字串的开头,那就不能用障眼法。这样还真不易想出解决方案,如果有空的话想想看看了,毕竟快高考了。
TX 的题好叼呀。。向您拜晚年了 :D

caoxudong8182011-02-12 14:41:41

对lz的程序提个问题,当
char str[] = "abcdefghijk";
int flag = 4 ;
时,
打印的结果是“efghijkdabc”,而不是“efghijkabcd”,似乎与题意并不相符。
因为lz的递归中,逐个移动相应的字符,当sizeof(str)-1不能整除flag时,就会出现最后的flag个字符乱序的情况。
解决方法我还没想到。
持续关注中。