马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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);
}
一个简单的问题就延伸出了这么多写法,你有什么更好的写法吗? |