您的位置:首页 > 其它

pku 1489解题报告

2011-07-17 20:59 330 查看
埃及乘法 二进制 打表
一.题意:
1.几个的符号分别代表1,10,100,1000,10 000
2.计算a*b,b用二进制表示。
3.第一列从1开始,用c表示,第二列从a。每次翻倍,当c>b时,结束。如果,c的二进制表示能表示b的二进制,加*号。最后,把带*号的c加起来,就是结果
二.思路:
1.处理输入tran(): 翻译a,b->ta,tb
用tr[]数组可以简短代码长度,下标用字符的ASCII码表示;用指针也可简短代码长度,不过,这是我第一次这样用,尝试一下
2.翻倍:
c,ta每次翻倍,要翻译成埃及字符,用trans()函数
trans 先计算1的个数(用取模),再是10…
3.判断c是否能构成tb(二进制),用按位与运算’&’,这是一个简单的方法,在网上找的
4.处理输出格式
5.答案:可以直接把ta*tb的结果用埃及字符表示输出
三.代码
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
char a[110],b[110],t[]={"|n98r"};
int tr[125],f[]={1,10,100,1000,10000,100000,100000};//后补两个构成6元素
//'|'=124 输出 34
int tran(char *a)
{int ta=0;
while(*a)ta+=tr[*a++];
return ta;
}
void trans(int a,char *x)
{
int i,n=0,mo;
for(i=0;i<5;i++)
{
mo=a%f[i+1]/f[i];//妙哉
if(mo)
{
while(mo--)x[n++]=t[i];
x[n++]=' ';
}
}x
=0;
}
int main()
{
int ta,tb,i,c;
char m1[100],m2[100];
tr['|']=1,tr['n']=10,tr['9']=100,tr['8']=1000,tr['r']=10000;
while(gets(a),strlen(a))
{
gets(b); c=1;
ta=tran(a);tb=tran(b);int tmp=ta;
for(i=0;c<=tb;c*=2,ta*=2,i++)
{
trans(c,m1);
trans(ta,m2);
printf("%s%c",m1,(tb&c)?'*':' ');//位与
int yu=34-1-strlen(m1);
while(yu--)putchar(' ');
puts(m2);
}trans(tmp*tb,m1);
printf("The solution is: %s\n",m1);
}
system("pause");
return 0;
}
四.通过这道题,掌握了&运算,更熟练的运用了指针和逗号运算符

补充:
&也可以做位运算(主要是针对二进制),表示“按位与”运算
如果两个数相应的二进位都是1,那么该位的结果值也是1,否则为0
比如:
0&0=0,0&1=0,1&0=0,1&1=1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: