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
一.题意:
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
相关文章推荐
- pku 2287 TianJi -- The Horse Racing 贪婪的dp 解题报告
- pku 1157 LITTLE SHOP OF FLOWERS 水货dp 解题报告
- pku 匈牙利算法 1469 COURSES 解题报告
- pku 3749 破译密码 解题报告
- pku 1004 解题报告
- ACM pku 2719 解题报告(都是输入输出惹的祸)
- PKU openjudge 1046 Square Number 解题报告
- Pku acm 3356 AGTC 动态规划题目解题报告(十)
- 【解题报告】PKU 2826 An Easy Problem?!
- pku 1961 KMP period 解题报告
- pku 2234(Matches Game)解题报告
- pku 1905 二分 Expanding Rods 解题报告
- pku 1179 polygon 石子合并的变形题dp 解题报告
- pku 3750 小孩报数问题 解题报告
- 空间人物行走的向量实现(pku1835解题报告)
- pku 1005 解题报告
- ACM PKU POJ 1112 解题报告
- Pku acm 1887 Testing the CATCHER 动态规划题目解题报告(十一)
- Pku acm 3253 Fence Repair 数据结构题目解题报告(一) ----哈夫曼数
- 【解题报告】poj openjudge 拼写检查 pku数算mooc 检索