算法实战2:打印九九乘法表,要求只能用一个变量

来自:http://bbs.csdn.net/topics/390608383

初看到这个的时候,让我想到http://blog.csdn.net/ylf13/article/details/12747119 这里的,不用关键字求和

这种反常规的题目,总是让我念念不忘想用递归,可是发现,还没有递归可以实现的算法能用到这里,希望有人写出来的指点迷津下,在此谢过。微笑

只准一个变量。。。

int main()
{
char const* const tbl = "1×1=1\n" 
"1×2=2 2×2=4\n" 
"1×3=3 2×3=6 3×3=9 \n" 
"1×4=4 2×4=8 3×4=12 4×4=16\n"  
"1×5=5 2×5=10 3×5=15 4×5=20 5×5=25\n"  
"1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36\n"  
"1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49\n"  
"1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64\n"  
"1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81";
puts(tbl);
  return 0;
}

还是这个算法最帅了。。。


其实这里就是想办法弄出两个变量表示1-9

可是通过一个变量怎么表示两个1-9的数呢?

可以通过除法,还有求余,比如99、98、97.。。只要我们能够得到十位数和各位数就可以实现了

同理,用位操作,1001 1001 也表示99(不是十进制)那么只要移位就可以了,不过有个注意的,用这个数比较你会发现,1001 1001表示的是负数,所以得用无符号的


//============================================================================
// Name        : PrintMultipleTable.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

void fun1();
void fun2();
void fun3();

int main()
{
	fun3();
    return 0;
}


void fun1(){
	int i =0;
	for (i = 0; i < 81; i++)
	{
		if(((i/9)+1) > ((i%9)+1)){
			continue;
		}
		cout<<((i/9)+1)<<"*"<<((i%9)+1)<<"="<<((i/9)+1)*((i % 9) + 1)<<"\t";
		if (i % 9 == 8)
		{
			cout<<("\n");
		}
	}
}

void fun2(){
	int i = 99;
	while(i>10){

		if(i%10 == 0 || (i/10)<(i%10)){
			i--;
			continue;
		}
		cout<<(i/10)<<"*"<<(i%10)<<"="<<(i/10)*(i%10)<<"\t";
		if(i%10 == 1)
			cout<<endl;
		i--;
	}
}

/*
 * 利用一个位为: 1001  1001 
 * 也是99 进行计算
 */
void fun3(){
	unsigned char i = 0x99;
	while(i>0x10){
		if((i&0x0F) == 0 || ((i>>4)&0x0F)<(i&0x0F)){
			i--;
			continue;
		}
		cout<<((i>>4)&0x0F)<<"*"<<(i&0x0F)<<"="<<((i>>4)&0x0F)*(i&0x0F)<<"\t";
		if((i&0x0F) == 1)
			cout<<endl;
		i--;
	}
}


9*9=81	9*8=72	9*7=63	9*6=54	9*5=45	9*4=36	9*3=27	9*2=18	9*1=9	
8*8=64	8*7=56	8*6=48	8*5=40	8*4=32	8*3=24	8*2=16	8*1=8	
7*7=49	7*6=42	7*5=35	7*4=28	7*3=21	7*2=14	7*1=7	
6*6=36	6*5=30	6*4=24	6*3=18	6*2=12	6*1=6	
5*5=25	5*4=20	5*3=15	5*2=10	5*1=5	
4*4=16	4*3=12	4*2=8	4*1=4	
3*3=9	3*2=6	3*1=3	
2*2=4	2*1=2	
1*1=1	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值