Problem1 找回原来的数
描述
小蓝鲸将重要的资料存放在了电脑里,但是很不幸的是,在这一条时间线上的计算机系统受到了奇怪的干扰,这批重要的资料的数据高位和低位发生了交换。已知的是,这批数字中的最大值不超过无符号整型范围,并且交换的两部分是数字的高16位和低16位(不足32位的数位补0)。这是一个简单的任务,小蓝鲸决定交给你完成,请你编程恢复所有的数。
输入
一个正整数n, 0 <= n <= 0xFFFFFFFF
输出
一个无符号正整数m,表示交换后的数
example
input: 1000(decimal)
output: 65,536,000(decimal)
参考代码:
#include<stdio.h>
#include <math.h>
int main()
{
long int a;
double l,s=0;
int arr[32], i=0, j, k;
scanf( "%ld", &a ); //初始化+读数
while(a){
arr[i]=a%2;
a/=2;
i++; //十进制转二进制,赋值于数组
}
for( j=i; j<32; j++ ){
arr[j]=0; //将剩余位数赋值为0
}
for( i=16,k=0; i<32; i++, k++){
l = pow( 2, k );
s += arr[i]*l ; //高位转换
}
for( i=0, k=16; i<16; i++, k++){
l = pow( 2, k );
s += arr[i]*l ; //低位转换
}
printf("%.0f\n",s); //输出
}
同时,如果采用十六位的输入输出,可采用如下代码:
# include <stdio.h>
int main()
{
unsigned int data;
scanf( "%x", &data );
data = ( data<<16 )|( data>>16 );
printf( "%0x", data );
return 0;
}
别问我为什么会写这个,因为一开始群里给的参考输入输出就是十六进制,然后一直不对,今天才发现OJ网站改了十进制的输入输出提示/绝了。
Problem2 二进制国度
描述
(也许这道题对某些同学来说似曾相识)
欢迎来到二进制国度,这里的所有钱币都是2的幂次,最大面值不限。
小蓝鲸有一定数量的钱币n
, 作为一个二进制国度的居民,它想要计算手上的钱可以有多少种划分方式。
举个例子,如果它手上有6元,那么它可以有如下划分方式:
1 + 1 + 4
1 + 1 + 2 + 2
1 + 1 + 1 + 1 + 2
1 + 1 + 1 + 1 + 1 + 1
2 + 2 + 2
2 + 4
一共6种方式划分手中的钱(划分方式与数字的排列无关,[1, 2, 1] 和 [1, 1, 2]是同一种方式)
小蓝鲸认为这是一个很简单的任务,所以它再一次决定让你们计算划分的方式
输入
一个正整数n,1 <= n <= 120
输出
一个正整数m,表示所有划分方式的总和
参考代码:
#include <stdio.h>
int main()
{
int n;
scanf( "%d", &n); //读数
int f[n], i;
f[1] = 1;
for( i=2; i<=n; i++ ){
if( i%2 == 1 ){
f[i] = f[i-1]; //输入为奇数时,有函数关系式f[i] = f[i-1]
}else{
f[i] = f[i-1] + f[i/2]; //输入为偶数时,有函数关系式f[i] = f[i-1] + f[i/2]
}
}
printf( "%d", f[n] ); //输出
return 0;
}
声明:
本专栏为2022春 南哪大学 程序设计基础 课程作业,答案为po主本人初次提交时所写,OJ判定满分,但非老师给出的参考答案,侵删。
为优化阅读体验,给出注释。有问题可在评论区写出,有空会解答或另写补充。