柚子快报邀请码778899分享:每日10题5
2080: [蓝桥杯][基础练习]十六进制转八进制
题目描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
方法1
#include
int main(){
int i,n,m[1000];
scanf("%d",&n);
for(i=0;i scanf("%x",&m[i]);//输入为16进制数 } for(i=0;i printf("%o\n",m[i]);//输出为8进制数 } return 0; } 方法2 #include int fact(int n){ //利用16进制转10进制再将10进制转8进制解决 if(n<8) //此行代码将10进制转为8进制 return n; else return fact(n/8)*10+n%8; } long fun(char *s){ //以下代码将16进制转为10进制 int i,t; long sum=0; for(i=0;s[i];i++){ if(s[i]>='0'&&s[i]<='9') t=s[i]-'0'; if(s[i]>='a'&&s[i]<='z') t=s[i]-'a'+10; if(s[i]>='A'&&s[i]<='Z') t=s[i]-'A'+10; sum=sum*16+t; } return fact(sum); } int main(){ int m[50],n,i; char s[50]; scanf("%d",&n); for(i=0;i scanf("%s",s); m[i]=fun(s); } for(i=0;i printf("%d\n",m[i]); } return 0; } 2082: [蓝桥杯][基础练习]十六进制转十进制 题目描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 输入 一个十六进制数 输出 对应得十进制 样例输入 FFFF 样例输出 65535 #include int main(){ int n; scanf("%x",&n);//输入为16进制数 printf("%d",n); return 0; } 2083: [蓝桥杯][基础练习]十进制转十六进制 题目描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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 方法1 #include int main(){ int n; scanf("%d",&n); printf("%x",n); return 0; } 方法2 #include int main() { int n, temp, i, t, j; char a[100]; while(scanf("%d", &n) != EOF) { if(n == 0) printf("%d", n); temp = n; i = 0; while(temp > 0) { t = temp%16; if(t < 10) { a[i] = t+'0'; }else{ a[i] = t-10+'A'; } temp /= 16; i++; } for(j = i-1; j >= 0; j--) printf("%c", a[j]); printf("\n"); } return 0; } 2084: [蓝桥杯][基础练习]特殊回文数 题目描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的。 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。 输入 输入一行,包含一个正整数n。 数据规模和约定 1<=n<=54。 输出 按从小到大的顺序输出满足条件的整数,每个整数占一行。 样例输入 52 样例输出 899998 989989 998899 #include int main(){ int n,i,a[10]={0}; scanf("%d",&n); int b,c,j; for(i=10000;i<=999999;i++){//所有的5位或6位数 b=i;//多用一个变量,只用一个变量的话,值在里循环会变掉 c=0;//循环一次就要将累加器清零 for(j=0;j<6;j++){//最高为6位,提取各位数字并相加 a[j]=b%10; b=b/10;//实现将已取出的位数删掉 c=c+a[j]; } if((i<99999)&&(a[0]==a[4]&&a[1]==a[3]&&c==n)){ printf("%d\n",i);//输出的是符合条件的5位数 } if((i>=100000)&&(a[0]==a[5]&&a[1]==a[4]&&a[2]==a[3]&&c==n)){ printf("%d\n",i);//输出的是符合条件的6位数 } } return 0; } 2085: [蓝桥杯][算法提高VIP]P1003 题目描述 作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。不过,有些狡猾的犯罪嫌疑人会改变某些单词的字母顺序,以逃避检查。请编写一个程序,发现这种调整过顺序的关键词。程序的输入有两行,第一行是关键词列表,第二行是待检查的句子。程序的输出为在该句子中所找到的经过顺序调整的关键词。(单词全部为小写,单词之间以一个空格分隔,每一行的单词个数不限) 输入 两行,第一行表示关键词,空格隔开 第二行是待检查的内容 输出 输出找到的经过顺序的关键词 样例输入 guns mines missiles aameric ssell snug dan iimsssle ot sit neeemis 样例输出 guns missiles #include int main(){ int key[1000][26]; ///用来存放每个关键词的某个单词的个数 int sen[26]; ///存放检索的句子中某个单词的个数 char str1[1000]; ///存放第一个字符串 char str2[1000]; ///存放第二个字符串 char temp[1000][100]; ///存放关键词 int a[1000]; int i,j,k; while(gets(str1)){ gets(str2); memset(a,0,sizeof(a)); memset(key,0,sizeof(key)); j=0; for(i = 0; i < strlen(str1); i++){ ///关键词 k = 0; while(str1[i]!=' '&&str1[i]!='\0'){ temp[j][k]=str1[i]; key[j][str1[i]-'a']++; i++; k++; } temp[j][k]='\0'; j++; } for(i = 0; i < strlen(str2); i++){ memset(sen,0,sizeof(sen)); while(str2[i]!=' '&&str2[i]!='\0'){ sen[str2[i]-'a']++; i++; } for(k = 0; k < j; k++){ if(a[k]==0){ int flag = 1,t1; for(t1=0;t1<26;t1++){ if(key[k][t1]!=sen[t1]){ flag = 0; break; } } if(flag) a[k]=1; } } } for(i = 0;i < j; i++){ if(a[i]){ printf("%s",temp[i]); break; } } i++; for(;i < j; i++){ if(a[i]){ printf(" %s",temp[i]); } } printf("\n"); } return 0; } 2086: [蓝桥杯][算法提高VIP]最长公共子序列 题目描述 给定两个字符串,寻找这两个字串之间的最长公共子序列。 输入 输入两行,分别包含一个字符串,仅含有小写字母。 输出 最长公共子序列的长度。 样例输入 abcdgh aedfhb 样例输出 3 思路 递归:当数组a和b对应位置字符相同时,则直接求解下一个位置; 否则,取两种情况中的较大数值。 #include char a[100],b[100];//定义字符串数组 int m,n; int cmp(int i,int j){ if(i>=m|| j>=n) return 0;//出口 if(a[i] == b[j]) return 1+cmp(i+1,j+1);//直接求解下一个位置 else //取两种情况中的较大数值 return cmp(i+1,j) > cmp(i,j+1) ? cmp(i+1,j) : cmp(i,j+1); } int main(){ scanf("%s%s",&a,&b);//输入字符串 m=strlen(a);//获取字符串长度 n=strlen(b); printf("%d",cmp(0,0));//输出子串长度 return 0; } 2087: [蓝桥杯][算法提高VIP]8皇后·改 题目描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。 输入 一个8*8的棋盘。 输出 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 样例输出 260 **参考**柳神的代码 #include int max = 0; int pic[8][8],i,j; int cmp(int pos[], int row) { for(i = 0; i < row; i++) { if(pos[i] == pos[row] || abs(i - row) == abs(pos[i] - pos[row])) return 0; } return 1; } void dfs(int pos[], int row) { if(row == 8) { int sum = 0; for(i = 0; i < 8; i++) { sum += pic[i][pos[i]]; } max = sum > max ? sum : max; return ; } for(pos[row] = 0; pos[row] < 8; pos[row]++) { if(cmp(pos, row)) { dfs(pos, row + 1); } } } int main() { int pos[8]; for(i = 0; i < 8; i++) { for(j = 0; j < 8; j++) { scanf("%d",&pic[i][j]); } } dfs(pos, 0); printf("%d\n",max); return 0; } Java版本 2088: [蓝桥杯][算法提高VIP]快速幂 题目描述 给定A, B, P,求(A^B) mod P。 输入 输入共一行。 第一行有三个数,N, M, P。 输出 输出共一行,表示所求。 共10组数据 对100%的数据,A, B为long long范围内的非负整数,P为int内的非负整数。 样例输入 2 5 3 样例输出 2 #include int main() { long long n,m; int p,i,sum=1; scanf("%lld %lld %d",&n,&m,&p); while(m){ if(m%2==1){ sum=(sum*n)%p; } m>>=1;//把m的二进制位向右移一位,再赋值,其实就是将m的值除以2,如6>>1就是把00000110右移一位变为00000011,结果是3 n=(n*n)%p; } printf("%d\n",sum); return 0; } 2091: [蓝桥杯][算法提高VIP]3-2求存款 题目描述 接受两个数,一个是用户一年期定期存款金额,一个是按照百分比格式表示的利率,计算一年期满后的本金与利息总额。说明:(1) 存款金额以人民币元为单位,精确到分;(2) 输入利率时不输入百分号,例如利率为3.87%,用户直接输入3.87;(3) 按照国家法律,存储利息所得需缴纳5%的所得税,计算结果时应当扣除所得税。(4) 显示的结果精确到人民币分。 注意:数据须用float表示;计算结果须保存到一个float变量中,再用printf输出。 输入 一行,以一个空格隔开的两个浮点数。 输入数据中每一个数的范围。本金<100000000,利息<100 输出 一个浮点数。 样例输入 5000.00 5.00 样例输出 5237.50 #include int main() { float a,b,sum=0; scanf("%f %f",&a,&b); printf("%.2f",a+a*0.95*b/100.0); return 0; } 2089: [蓝桥杯][算法提高VIP]不大的数 题目描述 在当今的大数据时代,超大数的高精度计算已经成为众多领域的热门研究之一。现在T校也想在此领域有所造诣已造福于全社会,然而由于时间有限,所以短时间内难以找出大数计算的通用算法,于是学校找到了同学中的“神霸”——你来帮忙,并仅要求你能在数并不算大的时候给出结果。又出于某种特殊需要,也并不要求你给出数的全部结果,而只是要求结果的前10位(注意不是后10位),并考虑到2的幂次的特殊性和典型性,所以要你计算的数均为2的幂次。 输入 一个自然数n。 数据规模和约定 0<=n<=10000000 输出 2的n次幂的前10位。 样例输入 60 样例输出 1152921504 思路 已知求 res=2^n ,遇到大的幂次方,可以利用对数来转化问题,两边对10取对数可得 : lg(res)=lg(2^n)=nlg(2), 如果2^n的位数小于十位直接输出即可 否则取对数后,去掉整数部分,对小数进行pow即可,然后取前十位即可; pow() 函数用来求 x 的 y 次方的值 #include int main(){ double n; scanf("%lf",&n); double a=log2(1000000000); if(n printf("%lld\n",(long long)pow(2.0,n)); return 0; } double res=n*log10(2)-(long long)(n*log10(2)); res=pow(10.0,res); while(res<1000000000){ res=res*10; } printf("%lld\n",(long long)res); return 0; } 2090: [蓝桥杯][算法提高VIP]最长字符序列 题目描述 设x(i), y(i), z(i)表示单个字符,则X={x(1)x(2)……x(m)},Y={y(1)y(2)……y(n)},Z={z(1)z(2)……z(k)},我们称其为字符序列,其中m,n和k分别是字符序列X,Y,Z的长度,括号()中的数字被称作字符序列的下标。 如果存在一个严格递增而且长度大于0的下标序列{i1,i2……ik},使得对所有的j=1,2,……k,有x(ij)=z(j),那么我们称Z是X的字符子序列。而且,如果Z既是X的字符子序列又是Y的字符子序列,那么我们称Z为X和Y的公共字符序列。 在我们今天的问题中,我们希望计算两个给定字符序列X和Y的最大长度的公共字符序列,这里我们只要求输出这个最大长度公共子序列对应的长度值。 举例来说,字符序列X=abcd,Y=acde,那么它们的最大长度为3,相应的公共字符序列为acd。 输入 输入一行,用空格隔开的两个字符串 输出 输出这两个字符序列对应的最大长度公共字符序列的长度值 样例输入 aAbB aabb 样例输出 2 思路:找到公共字符序列,统计它的长度,输出 #include #include int max(int a, int b){//自定义max函数 if(a>b) return a; return b; } int main(){ char a[100],b[100]; int i,j; scanf("%s %s",a,b); int c[100][100]={0}; for(i=1;i<=strlen(a);i++){//求字符串的长度 for(j=1;j<=strlen(b);j++){ if(a[i-1]==b[j-1]){ c[i][j]=c[i-1][j-1]+1; }else{ c[i][j]=max(c[i][j-1],c[i-1][j]); } } } printf("%d",c[strlen(a)][strlen(b)]); return 0; } 如有问题请留言!!! 柚子快报邀请码778899分享:每日10题5 相关文章
发表评论