这个月我都不知道忙什么了,反正蓝桥杯就这样过去了,把自己的整理的习题发上去吧。
问题描述
给定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; }