这个月我都不知道忙什么了,反正蓝桥杯就这样过去了,把自己的整理的习题发上去吧。
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100000
//输出
void Print(char *data,int n){
int i;
for(i=n-1;i>=0;i--)
printf("%c",data[i]);
printf("\0");
printf("\n");
}
//去掉前缀0
int Trim(char *data,int n){
while(data[--n]=='0');
return n+1;
}
//初始化
void Init(char *data,int n){
int i;
for(i=0;i<n;i++)
data[i]='0';
}
//16进制转化2进制
int HexToBinary(char *hex,char *binary){
int i;
int value;
int hex_n=strlen(hex);
int binary_n=0;
int length=4*hex_n;
if(length%3==1) length+=2;
else if(length%2==2) length++;
Init(binary,length);
for(i=hex_n-1;i>=0;i--){
int count=0;
switch(hex[i])
{
case 'A':value=10;break;
case 'B':value=11;break;
case 'C':value=12;break;
case 'D':value=13;break;
case 'E':value=14;break;
case 'F':value=15;break;
default:value=hex[i]-'0';
}
while(value)
{
binary[binary_n+count]=value%2+'0';
count++;
value/=2;
}
binary_n+=4;
}
return length;
}
//2进制转化8进制
int BinaryToOctal(char *binary,int binary_n,char *octal){
int i;
int n=0;
for(i=0;i+2<binary_n;i+=3){
octal[n++]=(binary[i]-'0')+(binary[i+1]-'0')*2+(binary[i+2]-'0')*2*2+'0';
}
return n;
}
int main(){
int n;
int i;
char hex[MAXSIZE];
char octal[3*MAXSIZE];
int octal_n;
char binary[4*MAXSIZE];
int binary_n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
gets(hex);
binary_n=HexToBinary(hex,binary);
octal_n=BinaryToOctal(binary,binary_n,octal);
octal_n=Trim(octal,octal_n);
Print(octal,octal_n);
}
return 0;
}
</span>
16进制转化10进制
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char a[8];
int i=0,length=0;
long int value=0;
gets(a);
length=strlen(a);
while(length)
{
if(a[length-1]>='A'&&a[length-1]<='F')
value+=(a[length-1]-'7')*pow(16,i++);
else
value+=(a[length-1]-'0')*pow(16,i++);
length--;
}
printf("%I64d",value);
return 0;
}
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100000
//输出
void Print(char *data,int n){
int i;
for(i=n-1;i>=0;i--)
printf("%c",data[i]);
printf("\0");
printf("\n");
}
//去掉前缀0
int Trim(char *data,int n){
while(data[--n]=='0');
return n+1;
}
//初始化
void Init(char *data,int n){
int i;
for(i=0;i<n;i++)
data[i]='0';
}
//16进制转化2进制
int HexToBinary(char *hex,char *binary){
int i;
int value;
int hex_n=strlen(hex);
int binary_n=0;
int length=4*hex_n;
if(length%3==1) length+=2;
else if(length%2==2) length++;
Init(binary,length);
for(i=hex_n-1;i>=0;i--){
int count=0;
switch(hex[i])
{
case 'A':value=10;break;
case 'B':value=11;break;
case 'C':value=12;break;
case 'D':value=13;break;
case 'E':value=14;break;
case 'F':value=15;break;
default:value=hex[i]-'0';
}
while(value)
{
binary[binary_n+count]=value%2+'0';
count++;
value/=2;
}
binary_n+=4;
}
return length;
}
//2进制转化8进制
int BinaryToOctal(char *binary,int binary_n,char *octal){
int i;
int n=0;
for(i=0;i+2<binary_n;i+=3){
octal[n++]=(binary[i]-'0')+(binary[i+1]-'0')*2+(binary[i+2]-'0')*2*2+'0';
}
return n;
}
int main(){
int n;
int i;
char hex[MAXSIZE];
char octal[3*MAXSIZE];
int octal_n;
char binary[4*MAXSIZE];
int binary_n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
gets(hex);
binary_n=HexToBinary(hex,binary);
octal_n=BinaryToOctal(binary,binary_n,octal);
octal_n=Trim(octal,octal_n);
Print(octal,octal_n);
}
return 0;
}
某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。通过编程,找出断号的ID和重号的ID。假设断号不可能发生在最大和最小号。
输入格式
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。每个整数代表一个ID号。
输出格式
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
#include<stdio.h>
int main(){
int a[10001]={0};
char c;
long m,min=100000,max=0,i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
while(1)
{
scanf("%ld",&m);
if(m>max) max=m;
if(m<min) min=m;
a[m]++;
c=getchar();
if(c!=' ') break;
}
for(i=min;i<=max;i++)
{
if(a[i]==0)
printf("%ld ",i);
if(a[i]==2)
m=i;
}
printf("%ld",m);
return 0;
}
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中元素的个数并依次输出数组元素。 样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以空格隔开的5个整数)
5
3 4 0 0 2
样例输出:(输出格式说明:3为非零数据的个数,3 4 2 是以空格隔开的3个非零整数)
3
3 4 2
样例输入
7
0 0 7 0 0 9 0
样例输出
2
7 9
样例输入
3
0 0 0
样例输出
0
#include <cstdio>
#include <cstdlib>
int CompactIntegers(int a[],int n)
{
int i,j;
for(i = j = 0;j < n;j++){
if(a[j])
a[i++] = a[j];
}
return i;
}
int main(int argc, char* argv[])
{
int *a;
int n;
scanf("%d",&n);
a = (int *)malloc(n * sizeof(int));
for(int i = 0;i < n;i++){
scanf("%d",a+i);
}
n = CompactIntegers(a,n);
printf("%d\n",n);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int CompactIntegers(int *a,int n){
int i,j;
for(i=0;i<n;i++)
{
if(a[i]==0)
{
for(j=i;j<n-1;j++)
a[j]=a[j+1];
n--;
i--;
}
}
return n;
}
int main()
{
int n,i;
int m;
int *a;
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
m=CompactIntegers(a,n);
printf("%d\n",m);
for(i=0;i<m;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出。要求尽可能使用函数实现程序代码。平均值为小数的只保留其整数部分。
样例输入
5
3 4 0 0 2
样例输出
9 1
样例输入
7
3 2 7 5 2 9 1
样例输出
29 4
#include <cstdio>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> a;
int n;
long long sum = 0;
vector<int>::iterator ivec;
scanf("%d",&n);
for(int i = 0;i < n;i++){
int temp;
scanf("%d",&temp);
a.push_back(temp);
}
for(ivec = a.begin();ivec != a.end();ivec++){
sum += *ivec;
}
printf("%I64d %I64d",sum,sum/n);
}
问题描述
编写一个程序,输入一个字符串(长度不超过20),然后把这个字符串内的每一个字符进行大小写变换,即将大写字母变成小写,小写字母变成大写,然后把这个新的字符串输出。
输入格式:输入一个字符串,而且这个字符串当中只包含英文字母,不包含其他类型的字符,也没有空格。
输出格式:输出经过转换后的字符串。
输入输出样例
样例输入
AeDb
样例输出
aEdB
#include <cstdio>
#include <cstring>
#define N 21
int main(int argc, char* argv[])
{
char str[N];
gets(str);
for(int i = 0;i < strlen(str);i++){
if(str[i] >= 'a' && str[i] <= 'z')
str[i] -= 32;
else
str[i] += 32;
}
puts(str);
问题描述
输入两个矩阵,分别是m*s,s*n大小。输出两个矩阵相乘的结果。
输入格式
第一行,空格隔开的三个正整数m,s,n(均不超过200)。
接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j)。
接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)。
输出格式
m行,每行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值。
样例输入
2 3 2
1 0 -1
1 1 -3
0 3
1 2
3 1
样例输出
-3 2
-8 2
提示
矩阵C应该是m行n列,其中C(i,j)等于矩阵A第i行行向量与矩阵B第j列列向量的内积。
例如样例中C(1,1)=(1,0,-1)*(0,1,3) = 1 * 0 +0*1+(-1)*3=-3
#include <cstdio>
#define MAX 220
int main(void)
{
int m,n,s;
int m1[MAX][MAX],m2[MAX][MAX],p[MAX][MAX];
scanf("%d%d%d",&m,&s,&n);
//init
for(int i = 0;i < m;i++){
for(int j = 0;j < s;j++){
scanf("%d",m1[i]+j);
}
}
for(int i = 0;i < s;i++){
for(int j = 0;j < n;j++){
scanf("%d",m2[i]+j);
}
}
for(int i = 0;i < m;i++){//遍历m1的行
for(int j = 0;j < n;j++){//遍历m2的列
int sum = 0;
for(int k = 0;k < s;k++){//做乘法,输入到p
sum += m1[i][k] * m2[k][j];
}
p[i][j] = sum;
}
}
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
#include<stdio.h>
int main(){
int m,s,n;
int i,j,k;
int a[100][100]={0},b[100][100]={0},c[100][100]={0};
scanf("%d%d%d",&m,&s,&n);
for(i=0;i<m;i++)
for(j=0;j<s;j++)
scanf("%d",&a[i][j]);
for(j=0;j<s;j++)
for(i=0;i<n;i++)
scanf("%d",&b[j][i]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(k=0;k<s;k++)
c[i][j]+=a[i][k]*b[k][j];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",c[i][j]);
printf("\n");
}
}
问题描述
编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。
输入格式:输入只有一行,即三个整数,中间用空格隔开。
输出格式:输出只有一行,即排序后的结果。
输入输出样例
样例输入
9 2 30
样例输出
30 9 2
#include <stdio.h>
int main(int argc, char* argv[])
{
int a[3];
scanf("%d%d%d",a,a+1,a+2);
for(int i = 0;i < 2;i++)
for(int j = i+1;j < 3;j++)
if(a[i] < a[j]){
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
printf("%d %d %d",a[0],a[1],a[2]);
return 0;
}
int main(){
int a[3];
scanf("%d%d%d",a,a+1,a+2);
for(int i=0;i<2;i++)
for(int j=i+1;j<3;j++)
if(a[i]<a[j]){
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
printf("%d %d %d",a[0],a[1],a[2]);
return 0;
}
问题描述
给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
输入格式
第一行包含一个数n,表示序列长度。
第二行包含n个正整数,表示给定的序列。
第三个包含一个正整数m,表示询问个数。
接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。
输出格式
总共输出m行,每行一个数,表示询问的答案。
样例输入
5
1 2 3 4 5
2
1 5 2
2 3 2
样例输出
4
2
数据规模与约定
对于30%的数据,n,m<=100;
对于100%的数据,n,m<=1000;
保证k<=(r-l+1),序列中的数<=106。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i,j,t,temp;
int n,m,l,r,k;
int *a,*copy;
scanf("%d",&n);
a = (int *)malloc( (n+1) * sizeof(int) );
for(i=1;i<=n;i++)
scanf("%d",a+i);
scanf("%d",&m);
for(t=0;t<m;t++){
scanf("%d%d%d",&l,&r,&k);
copy = (int *)malloc( (r-l+1) * sizeof(int) );
for(i=0;i<r-l+1;i++)
copy[i] = a[l+i];
for(i=0;i<r-l;i++){
for(j=i+1;j<r-l+1;j++){
if(copy[i] < copy[j]){
temp = copy[i];
copy[i] = copy[j];
copy[j] = temp;
}
}
}
printf("%d\n",copy[k-1]);
free(copy);
}
将字符串转化成整形数字
#include<stdio.h>
#include<string.h>
int Translate(char *ch,int *a){
int i=0;
int y;
char *p=ch;
// fflush(stdin);
while(*p)
{
if(*p>='0'&&*p<='9')
{
y=0;
while(*p!=' '&&*p)
{
y=y*10+*p-'0';
p++;
}
a[i++]=y;
}
p++;
}
return i-1;
}
int main(){
char ch[1000];
int a[50]={0};
int n;
int i;
gets(ch);
n=Translate(ch,a);
printf("num=%d\n",n);
for(i=0;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
问题描述
给两组数,各n个。
请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
例如两组数分别为:1 3 -5和-2 4 1
那么对应乘积取和的最小值应为:
(-5) * 4 + 3 * (-2) + 1 * 1 = -25
输入格式
第一个行一个数T表示数据组数。后面每组数据,先读入一个n,接下来两行每行n个数,每个数的绝对值小于等于1000。
n<=8,T<=1000
输出格式
一个数表示答案。
样例输入
231 3 -5-2 4 151 2 3 4 51 0 1 0 1
样例输出
-256
#include <cstdio>
#define N 10
int main(void)
{
int a[N],b[N];
int n;
int min = 0;
int T;
scanf("%d",&T);
for(int k = 0;k < T;k++){
min = 0;
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",a+i);
for(int i = 0;i < n;i++)
scanf("%d",b+i);
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(a[i] < a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(b[i] > b[j]){
int temp = b[i];
b[i] = b[j];
b[j] = temp;
}
}
}
}
问题描述
编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中。当用户输入0时,表示输入结束。然后程序将把这个数组中的值按逆序重新存放,并打印出来。例如:假设用户输入了一组数据:7 19 -5 6 2 0,那么程序将会把前五个有效数据保存在一个数组中,即7 19 -5 6 2,然后把这个数组中的值按逆序重新存放,即变成了2 6 -5 19 7,然后把它们打印出来。
输入格式:输入只有一行,由若干个整数组成,中间用空格隔开,最末尾的整数为0。
输出格式:输出也只有一行,即逆序排列后的整数,中间用空格隔开,末尾没有空格。
输入输出样例
样例输入
7 19 -5 6 2 0
样例输出
2 6 -5 19 7
#include <cstdio>
#define N 20
int main(void){
int a[N];
int n = 0;
int temp;
while(1){
scanf("%d",&temp);
if(temp == 0)
break;
else
a[n++] = temp;
}
for(int i = n-1;i >= 0;i--)
printf("%d ",a[i]);
return 0;
}
#include<stdio.h>
int main()
{
int a[20];
int i=0,n,j;
while(1){
scanf("%d",&a[i]);
if(a[i]==0)
break;
i++;
}
for(j=i-1;j>=0;j--)
printf("%d ",a[j]);
printf("\n");
return 0;
}
问题描述
编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束。然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来。说明:(1)0表示输入结束,它本身并不计入这组整数中。(2)在这组整数中,既有正数,也可能有负数。(3)这组整数的个数不少于2个。
输入格式:输入只有一行,包括若干个整数,中间用空格隔开,最后一个整数为0。
输出格式:输出第二大的那个整数。
输入输出样例
样例输入
5 8 -12 7 0
样例输出
7
#include <cstdio>
#define N 25
int main(void)
{
int a[N];
int n;
for(n = 0;n < 20;){
scanf("%d",a+n);
if(a[n] == 0)
break;
else
n++;
}
for(int i = 0;i < n-1;i++){
for(int j = i+1;j < n;j++){
if(a[i] < a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
编写函数Normalize,将复数归一化,即若复数为a+bi,归一化结果为a/sqrt(a*a+b*b) + i*b/sqrt(a*a+b*b) 。使用结构体指针类型作为函数参数可能是必要的。其中实部和虚部由键盘输入,输出为归一化结果,如果归一化结果的实部或虚部为小数的要求保留一位小数。
样例输入:(格式说明:3 4 分别为以空格隔开的实数的实部和虚部)
3 4
样例输出
0.6+0.8i
样例输入
2 5
样例输出
0.4+0.9i
#include <cstdio>
#include <cmath>
#define N 20
typedef struct node{
int a;
int b;
}data;
int main(void){
data d;
double ta,tb,tn;
scanf("%d%d",&d.a,&d.b);
tn = (double)sqrt(d.a*d.a+d.b*d.b);
ta = d.a / tn;
tb = d.b / tn;
}
问题描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入格式
一个正整数 n (10<n<100), 表示要求满足的数位和。
输出格式
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
样例输入
60
样例输出
-1
#include <stdio.h>
int main(void)
{
int n;
int tag = 1;
scanf("%d",&n);
for(int i = 10000;i <= 999999;i++){
int s = 0;
int x = i;
int count = 0;
while(x){
int temp = x%10;
x/=10;
s = s*10 + temp;
count += temp;
}
if(count == n && s == i){
printf("%d\n",i);
tag = 0;
}
}
if(tag)
printf("-1");
return 0;
}
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
int *a;
int i;
int sum=0,bettersum=0;
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",a+i);
for(i=0;i<n;i++){
sum+=a[i];
//如果当前和值为零,则把当前和值置为零
if(sum<0)
sum=0;
//如果当前和值大于最优值,则最优值记录当前和值
if(bettersum<sum)
bettersum=sum;
}
//如果数组全为负值,只需要找到一个最大的负值
if(0==bettersum) {
bettersum=a[0];
for(i=0;i<n;i++){
if(a[i]>bettersum)
bettersum=a[i];
}
}
printf("bettersum=%d\n",bettersum);
return 0;
}