0
点赞
收藏
分享

微信扫一扫

2022春 南哪大学 程序设计基础 OJ答案参考(6)

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 + 1 + 4
  2. 1 + 1 + 2 + 2
  3. 1 + 1 + 1 + 1 + 2
  4. 1 + 1 + 1 + 1 + 1 + 1
  5. 2 + 2 + 2
  6. 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判定满分,但非老师给出的参考答案,侵删。

为优化阅读体验,给出注释。有问题可在评论区写出,有空会解答或另写补充。

举报

相关推荐

0 条评论