|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
先给学算法的童鞋介绍一本书 《编程之美》。 很有意思!! 第一章是讲如何玩CPU,呵呵好玩把?
先来看上面的一道题:
注意题目要求只能使用一个变量! 好坑爹的说~~~~~~
这个问题实际上就是找两个量在3X3的矩阵上不再同一列,也就是 x%3!=y%3
看代码:
- void easy(){
- for(int i=1;i<=9;i++)
- for(int j=1;j<=9;j++)
- if(i%3 != j%3)
- printf("A=%d,B=%d\n",i,j);
- }
复制代码
但是题目要求的是只能使用1个变量。那该怎么做呢?上面用到了两个char,两个char就是short int类型。 short int可以算是一个变量,然后用指针转换为char数组,记住不能使用使用第二个变量中转,所以要写很多转换代码。
- #define pChar(x) ((char *)&x)
- void fun3()
- {
- // 利用指针来操作同一个变量
- short int i2;
- for(*pChar(i2)=1;*pChar(i2)<=9;*pChar(i2)+=1)
- for(pChar(i2)[1]=1;pChar(i2)[1]<=9;pChar(i2)[1]++)
- if(pChar(i2)[0]%3 != pChar(i2)[1]%3)
- printf("A=%d,B=%d\n",pChar(i2)[0],pChar(i2)[1]);
- }
复制代码
这个是书上的一段代码:
- char i=81;
- while(i--)
- {
- if(i / 9 % 3 == i % 9 % 3)
- continue;
- printf("A = %d, B = %d/n", i / 9 + 1, i % 9 + 1);
- }
- return 0;
复制代码
i=81 实际上是把两次循环变为了一次循环,很有意思把。
这里还有一种方法,用到了结构体。
- struct{
- unsigned char a:4;
- unsigned char b:4;
- }i;
- void fun2()
- {
- for(i.a=1;i.a<=9;i.a++)
- for(i.b=1;i.b<=9;i.b++)
- if(i.a%3!=i.b%3)
- printf("A=%d,B=%d\n",i.a,i.b);
- }
复制代码
一个简单的问题就延伸出了这么多写法,你有什么更好的写法吗? |
评分
-
参与人数 2 | 荣誉 +13 |
鱼币 +13 |
贡献 +11 |
收起
理由
|
拈花小仙
| + 5 |
+ 5 |
+ 3 |
热爱鱼C^_^ |
小甲鱼
| + 8 |
+ 8 |
+ 8 |
热爱鱼C^_^ |
查看全部评分
|