第一题:第几天
New Online Judge 提交链接
答案:125
解题方法:
- 点击电脑自带计算器
- 点查看
- 点日期计算
- 输出起始日期和终止日期,得出天数
- 最后天数+1
第二题:明码
New Online Judge 提交链接
答案:387420489
明码所表示的10个汉字为:九的九次方等于多少?
题意:
- 10行数据,每1行的32个数字都可以表示一个汉字
- 每个汉字是一个16*16的图案
- 因此每2个数字可以表示图案的1行
- 1个数字可由8位的二进制数表示,不满8位补0,2位数字可得16位
- 注意每个数字的都是以补码的形式表示。
得补码
- 正数:原码=反码=补码
- 负数:比如-13,原码10001101,补码11110011
方法1:原码的符号位不变,其它位取反,最后+1
方法2:原码的符号位不变,从右至左找第一个1的位置,该位置的左边全取反,该位置的右边都不变。
编程时选择方法2得补码。
解题思路:
每1个数变为8位的二进制数,再变成字符存放到二维字符数组里面,每输入一行数据打印1个汉字,这里不选择打印0和1,看起来不是很方便,0打印空格,1打印*
打印汉字代码1:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char e[20][20];
int main()
{
int i,j,a,b,k,l,flag,f;
for(i=1;i<=10;i++)
{
for(j=1;j<=16;j++)
{
//初始化数组
for(l=1;l<=16;l++) e[j][l]='0'; e[j][l]='\0';
scanf("%d %d",&a,&b);
flag=0;
if(a<0) //负数,高位置1
{
flag=1;
e[j][1]='1';
a=-a;
}
k=8; //转二
while(a)
{
e[j][k]=a%2+'0';
a/=2;
k--;
}
if(flag)//负 //负数补码
{
f=0;
for(l=8;l>=2;l--)
{
if(f==1)
{
if(e[j][l]=='0')
e[j][l]='1';
else
e[j][l]='0';
}
if(e[j][l]=='1')
f=1;
}
}
flag=0;
if(b<0)
{
flag=1;
e[j][9]='1';
b=-b;
}
k=16;
while(b)
{
e[j][k]=b%2+'0';
b/=2;
k--;
}
if(flag)//负
{