目录
1.A+B问题
问题描述
输入A、B,输出A+B。
输入格式
输入的第一行包括两个整数,由空格分隔,分别表示A、B。
输出格式
输出一行,包括一个整数,表示A+B的值。
样例输入
12 45
样例输出
57
数据规模与约定
-10000 <= A, B <= 10000。
示例代码
#include<iostream>
using namespace std;
int main() {
int a, b,c;
cin >> a >>b;
cout << a + b;
}
2.数列排序
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
示例代码
#include <iostream>
#include <algorithm>
using namespace std;
int main ()
{
int n,a[200];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
cout<<a[i]<<' ';
}
return 0;
}
利用sort函数可以快速解决数组排序问题,对应的头文件为algorithm
sort函数的第一个参数为需要排序的数的首地址(不一定是数组首地址),第二个参数为末地址。
3.十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制
示例代码
#include<iostream>
using namespace std;
struct Shiliu{
int size ;
string a;
};
int e[200][200000],f[200];
int c[200][400000];
struct Shiliu b[200];
int shiliuzhuanint(char d) {
int temp;
switch (d) {
case '0':temp = 0; break;
case '1':temp = 1; break;
case '2':temp = 2; break;
case '3':temp = 3; break;
case '4':temp = 4; break;
case '5':temp = 5; break;
case '6':temp = 6; break;
case '7':temp = 7; break;
case '8':temp = 8; break;
case '9':temp = 9; break;
case 'A':temp = 10; break;
case 'B':temp = 11; break;
case 'C':temp = 12; break;
case 'D':temp = 13; break;
case 'E':temp = 14; break;
case 'F':temp = 15; break;
}
return temp;
}
void shiliuzhuaner(struct Shiliu b[200], int i, int c[200][400000]) {
int temp;
for (int j = 0; j < b[i].size; j++) {
temp = shiliuzhuanint(b[i].a[j]);
c[i][j * 4] = temp / 8;
c[i][j * 4 + 1] = temp % 8 / 4;
c[i][j * 4 + 2] = temp % 4 / 2;
c[i][j * 4 + 3] = temp % 2;
}
}
void erzhaunba(int c[200][400000],int e[200][200000],int i, struct Shiliu b[200],int f[200]) {
int temp,res,temp1=1;
temp = b[i].size * 4;
res = temp % 3;
temp /= 3;
if (res != 0) {
temp++;
f[i] = temp;
for (int j = 0; j <temp; j++) {
if (j == 0) {
if (res == 1) {
e[i][j] = c[i][j] * 1;
}
if (res == 2) {
e[i][j] = c[i][j] * 2 + c[i][j + 1] * 1;
}
}
else {
e[i][j] = c[i][(j - 1) * 3 + res] * 4 + c[i][(j - 1) * 3 + res + 1] * 2 + c[i][(j - 1) * 3 + res + 2] * 1;
}
}
}
else {
f[i] = temp;
for (int j = 0; j < temp; j++) {
e[i][j] = c[i][j * 3 ] * 4 + c[i][j * 3 + 1] * 2 + c[i][j *3 + 2] * 1;
}
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> b[i].a;
b[i].size = b[i].a.length();
}
for (int i = 0; i < n; i++) {//十六进制转二进制已经完成
shiliuzhuaner(b, i, c);
}
for (int i = 0; i < n; i++) {
erzhaunba(c, e, i, b,f);
}
int flag = 1;
for (int i = 0; i < n; i++) {
flag = 1;
for (int k = 0; k < f[i]; k++) {
if (e[i][k] == 0 && flag == 1) {
}
else {
cout << e[i][k];
flag = 0;
}
}
cout << endl;
}
return 0;
}
变量:
结构体Shiliu的size表示该字符串的长度,a表示输入的字符串
数组c存储2进制,e存储八进制,f存储e的元素数目
函数:
shiliuzhuanint函数是把表示16进制数的字符转化为10进制整型数并返回
shiliuzhuaner函数是将16进制字符转化为2进制整型数并储存在数组c里,一个16进制数可以转变为4个二进制数
erzhuanba函数是将2进制转化为8进制,并存储八进制数的数目,假设输入n个字符串,则共4n个二进制数,而每个八进制数需要3个二进制数,此外应该从二进制数组的最后三个元素开始构成八进制数,从后往前,如果剩下的二进制数不足3个,从后往前,按乘1,2来计算
主函数中flag的作用是是否找到非0前导,如果找到,后续的0都能输出,否则没有一个0可以输出,当然无论如何非0的数都能输出。
至于为什么使用那么多全局变量,是因为全局变量占用的是堆,如果在主函数定义,就会占用栈,栈的空间不够用,但堆的地方够用
4.十六进制转十进制
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
示例代码
#include<iostream>
using namespace std;
int shiliuzhuanint(char d) {
int temp=0;
switch (d) {
case '0':temp = 0; break;
case '1':temp = 1; break;
case '2':temp = 2; break;
case '3':temp = 3; break;
case '4':temp = 4; break;
case '5':temp = 5; break;
case '6':temp = 6; break;
case '7':temp = 7; break;
case '8':temp = 8; break;
case '9':temp = 9; break;
case 'A':temp = 10; break;
case 'B':temp = 11; break;
case 'C':temp = 12; break;
case 'D':temp = 13; break;
case 'E':temp = 14; break;
case 'F':temp = 15; break;
}
return temp;
}
int main() {
string a;
cin >> a;
int b, c[8];
b = a.length();
for (int i = 0; i < b; i++) {
c[i] = shiliuzhuanint(a[i]);
}
unsigned long long int temp, res = 0;
temp = 1;
for (int i = b - 1; i >= 0; i--) {
res = res + temp * c[i];
temp =temp * 16;
}
cout << res;
return 0;
}
变量:
a是输入的十六进制字符串,b是存储十六进制字符串的长度,数组c用来存储a对应的每个位置上转变后的十进制数字 。
函数:
shiliuzhuanint函数就是将输入的十六进制字符转化为十进制。
主函数通过累加累乘,把十进制数组整合起来输出。
5.十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
示例代码
#include<iostream>
using namespace std;
void shizhuanshiliu(unsigned long long int* d,char* temp) {
switch (*d) {
case 0:*temp='0'; break;
case 1:*temp = '1'; break;
case 2:*temp = '2'; break;
case 3:*temp = '3'; break;
case 4:*temp = '4'; break;
case 5:*temp = '5'; break;
case 6:*temp = '6'; break;
case 7:*temp = '7'; break;
case 8:*temp = '8'; break;
case 9:*temp = '9'; break;
case 10:*temp = 'A'; break;
case 11:*temp = 'B'; break;
case 12:*temp = 'C'; break;
case 13:*temp = 'D'; break;
case 14:*temp = 'E'; break;
case 15:*temp = 'F'; break;
}
}
int main() {
unsigned long long int a;
cin >> a;
char c[100];
unsigned long long int b[100], count=1, ans = 16;
while (a / ans != 0) {
count++;
ans *= 16;
}
ans /= 16;
for (int i = 0; i < count; i++) {
b[i] = a / ans;
shizhuanshiliu(&b[i], &c[i]);
cout << c[i];
a = a % ans;
ans /= 16;
}
return 0;
}
变量:
a是输入的十进制数字,b是存储十进制转化为十六进制的各个位置上的整型数字,数组c是存储b的字符形式
函数:
shizhuanshiliu函数是把十进制数转变为十六进制数
主函数的while循环是计算a转化为16进制数后的位数,for循环则是将16进制数整合10进制数相加,并输出