从零单排PAT1019,1020,1021,1022

1019数字黑洞  题目要求:

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089

9810 - 0189 = 9621

9621 - 1269 = 8352

8532 - 2358 = 6174

7641 - 1467 = 6174

... ...

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入格式:

输入给出一个(0, 10000)区间内的正整数N。

输出格式:

如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。

输入样例1:

6767

输出样例1:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

输入样例2:

2222

输出样例2:

2222 - 2222 = 0000

解题思路:就是一个简单的排序,我是以字符串的形式存储,然后将数字从大到小,从小到大排列,并计算得出对应的数值,最后相减就可以计算,由于题目已经是4位数,所以可以直接分配数据空间,但是需要注意的一个case是如果计算的结果不是四位数那该怎么办?排序还是一样的,注意直接输出字符串,不要输出数字(可能会出现三位数);如果所有数字相同,输出0000

源代码:

#include <iostream>
#include <algorithm>

using namespace std;
int compareS(const void *a,const void *b)
{
	return *(int*)a > *(int*)b;  //升序排列
}
int compareJ(const void *a,const void *b)
{
	return *(int*)a < *(int*)b;  //降序排列
}
int getNumber(int a)
{
	int d = a;
	int b = 0;
	int c[4] = {0,0,0,0}; //存储第一个数字
	int e[4] = {0,0,0,0}; //存储第二个数字
	int result = 0;
	for(int i=0;i<4;i++)
	{
		c[i] = d % 10;
		e[i] = d % 10;
		d = d/10;
	}
	qsort(&c[0],4,sizeof(int),compareJ);
	qsort(&e[0],4,sizeof(int),compareS);
	a = 0;
	for(int i=0;i<4;i++)
	{
		a = a*10 + c[i];  //得到实际数字
		b = b*10 + e[i];
	}
	result = a - b;
	if(result != 0 && result >= 1000)
	{
		cout << a << " " << "-" << " " << c[3] << c[2] << c[1] << c[0] << " "
		<< "=" << " " << result << endl;
	}
	else if(result == 0)
	{
		cout << a << " " << "-" << " " << c[3] << c[2] << c[1] << c[0] << " "
		<< "=" << " " << "0000" << endl;
	}
	else //只会出现3位数,不可能出现小于3位数
	{
		cout << a << " " << "-" << " " << c[3] << c[2] << c[1] << c[0] << " "
		<< "=" << " " << '0' << result << endl;
	}
	return result;
}

int main()
{
	int num;
	cin >> num;
	do	//必须要执行第一个计算
	{
		num = getNumber(num);
	}while( num != 6174 && num != 0);
	system("pause");
	return 0;
}

1020月饼  题目要求:

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入格式:

每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。

输出格式:

对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。

输入样例:

3 20
18 15 10
75 72 45

输出样例:

94.50

解题思路:这其实就是一个简单的贪婪算法,先根据单价最高的进行计算,如果单价最高的总量不能满足,则用单价第二高的,以此类推,直到达到市场最大需求量。因为一直有几个case过不去,后来看看别人的代码,是因为自己的对于总量和单价都用int型表示,在这里不够准确,索性都用float类型,也省去了强类型转换的问题。还有一个是,cout的标准输出,输出小数点后两位,用cout.setf(ios::fixed);

源代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
void swap (int *a,int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void swap(float *a,float *b) //重载
{
	float temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	int N,max;//不同的个数,最大吨数
	cin >> N >> max;
	vector<float> kucun;//库存数量
	vector<float> zongjia;//各个总价
	vector<float> per;
	for(int i=0;i<N;i++)
	{
		float temp ;
		cin >> temp;
		kucun.push_back(temp);
	}
	for(int i=0;i<N;i++)
	{
		float temp ;
		cin >> temp;
		zongjia.push_back(temp);
		per.push_back((float)temp/kucun[i]);
	}
	for(int i=0;i<N-1;i++) //冒泡排序
	{
		for(int j=0;j<N-1;j++)
		{
			if(per[j]<per[j+1])  //数组降序排列
			{
				swap(per[j],per[j+1]);
				swap(kucun[j],kucun[j+1]);
				swap(zongjia[j],zongjia[j+1]);
			}
		}
	}
	int residue = max;//剩余吨数
	float income = 0; //实际收益
	int temp;
	int count;
	for(count=0;count<N;count++)
	{
		temp = residue - kucun[count];
		if(temp < 0)
		{
			income += residue * per[count];  //得到总收益
			break;
		}
		else
		{
			residue = temp;
			//income += kucun[i] * per[i];  //得到总收益
			income += zongjia[count];
		}
	}
	cout.setf(ios::fixed);
	cout << setprecision(2) << income ;
	system("pause");
	return 0;
}

1021个位数统计  题目要求:

给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1,
dk-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。

输入格式:

每个输入包含1个测试用例,即一个不超过1000位的正整数N。

输出格式:

对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

解题思路:这是一道不能再简单的题目,所以没什么可说的

源代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string num;
	int a[10] = {0,0,0,0,0,0,0,0,0,0};
	//int a[10];
	//memset(a,0,sizeof(a));
	cin >> num;
	int lenth = num.size();
	for(int i=0;i<lenth;i++)
	{
		switch(num[i])
		{
		case '0':a[0]++;break;
		case '1':a[1]++;break;
		case '2':a[2]++;break;
		case '3':a[3]++;break;
		case '4':a[4]++;break;
		case '5':a[5]++;break;
		case '6':a[6]++;break;
		case '7':a[7]++;break;
		case '8':a[8]++;break;
		case '9':a[9]++;break;
		}
	}
	for(int i=0;i<10;i++)
	{
		if(a[i] != 0)
		{
			cout << i << ":" << a[i] <<endl;
		}
	}
	system("pause");
	return 0;
}

1022 D进制 A+B 题目要求:

输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

输入格式:

输入在一行中依次给出3个整数A、B和D。

输出格式:

输出A+B的D进制数。

输入样例:

123 456 8

输出样例:

1103

解题思路:这是计算机相关专业的基础知识,需要知道只是怎么计算D进制数,因为数都小于2的30次-1,所以可以用int型直接存储,相加得到的数据整除D,最后逆序输出即可得到D进制数(原本是先得到10进制数,但随后就发现,只要把10换成D,就可以得到D进制数),但需要注意的case是两个非负的整数相加可能为0,所以考虑0时,输出0。

源代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	unsigned int A,B,D;
	vector <int> a;  //存储10进制数
	vector <int> b;	//存储N进制数
	cin >> A >> B >> D;
	unsigned int temp = A + B;
	if(temp == 0) //如果=0时,因为都是非0,这个条件要考虑
	{
		cout << '0' << endl;
		system("pause");
		return 0;
	}
	else
	{
		while(temp!=0)
		{
			a.push_back(temp % D);
			temp /= D;
		}
		int lenth = a.size();
		for(int i=0;i<lenth;i++)
		{
			cout << a[lenth - i - 1];
		}
		cout << endl;
		system("pause");
		return 0;
	}
}

从零单排PAT1019,1020,1021,1022

时间: 2024-11-05 23:46:33

从零单排PAT1019,1020,1021,1022的相关文章

PAT从零单排

偶然原因开始了PAT之旅前前后后用了3天时间刷完了PAT Basic(35题) 现在记录下从零单排的过程,总的来说题目很简单 当然有个别题目的坑点还是比较给力的,准确的说,题目的数据很给力 1001. 害死人不偿命的(3n+1)猜想 (15) 纯模拟题,是偶数除以2,奇数(3n+1)除以2,到1结束 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,

从零单排之玩转Python安全编程(II)

转自:http://www.secpulse.com/archives/35893.html 都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的. 而Python是最容易入门且使用最顺手的脚本语言,为了不引起程序员世界大战,我们不说Python是世界上最好的语言,没有之一. 这是<从零单排之玩转Python安全编程>的第二篇.第一篇参见安全脉搏<从零单排之玩转Python安全编程(I)> 本教程继续展示一些基本的Python脚本概念

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击

提要 今天要实现的是一个简单人物控制器.包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画.虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现.先上效果图: 场景搭建 首先下载这个package,里面包含了人物的动作还有地面的模型.将人物和地面都拖进场景中.这里的模型默认的动画模式是lagacy,不用修改.模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale

PHP从零单排(十八)图片处理

1.打开已经存在的图片 <?php header("Content-type:image/jpeg"); $img=imagecreatefromjpeg("cc.jpg"); imagejpeg($img); imagedestroy($img); ?> 函数imagecreatefromjpeg()的参数即文件所在路径,返回值是参数所指图片的资源标识符.该函数时通过已有图像新建一个图像,并不是单纯打开原图像本身.如果将图片的后缀名.jpg强制改为.p

从零单排入门机器学习:Octave/matlab的常用知识之矩阵和向量

Octave/matlab的常用知识之矩阵和向量 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一下总结.小弟才学疏浅,如有错误,敬请指导. Andrew的课程选了Octave/matlab为编程语言.他选择这个估计更多是考虑大众性,这门语言容易入门. 然后我觉得学会使用Octave/matlab还是挺有用的.一来是她天生是个数学工具,开始的研究阶段使用她最方便莫属,注意我这里所说的是研究阶段,商用

Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同对应的动画就是clip,每个运动都是一段单独的动画,使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画. animation.Play("name"); animation.CrossFade("name"); 下面的是它的几个属性 Animation:默认的动画片段: Aniamtions:包含的动画片段: Play Automaticall

php从零单排-00

php是什么? php是一种服务器端的语言,用来产生动态网页 我为什么要学习php? 作为半路出家程序员,对web的了解几乎为零,php简单易学,资料齐全,能够减轻web学习的畏惧感. web的外延很广,可以接触到更多的领域,能拓展视野,并帮助自己找到自己喜爱并擅长的领域. 能做点小项目,锻炼之余挣点外块,补充一下自己的钱包. 准备怎样学习php?. php100的新版教程,w3schools,php官网 学而不思则罔,思而不学则殆:一边学,一边做总结: 光说不练假把式,光练不说傻把式:一边学,

php从零单排-01

1. 初识PHP PHP是Hypertext Preprocessor首字母的递归缩写,主要应用于web开发,目前使用比较广泛,资料也比较齐全,另外PHP是开源的. PHP能够直接内嵌到网页之中: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> &

从零单排入门机器学习:OctaveMatlab的常用知识之画图

OctaveMatlab的常用知识之画图 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一下总结.小弟才学疏浅,如有错误,敬请指导. 看几个例子即可. 'ro'的含义,r表示红色,o表示o形. 可以记住某些常用的选项. 一条命令画两条线.其实可以多条. 一般来说,用户在新输入plot 命令之后,原图片上的内容将被删除.如果你想保存当前的图片内容并将新创建的图片层叠到原图片上,你可以通过使用hold