7-15 BCD解密
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
代码如下
#include<stdio.h> int main() { int num; scanf("%d",&num); printf("%x",num); return 0; }
实际上就是输入一个数,将这个数转化为16进制;
#include<stdio.h> int main() { int n =0; scanf("%d",&n); int a,b; a=n/16; b=n%16; printf("%d",10*a+1*b); return 0; }
7-16 数列求和-加强版
给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
代码如下
#include <stdio.h> int main() { int A, N; scanf("%d %d", &A, &N); int s[100001] = {0}; int jinwei = 0, num = N, weishu = 0; for (int i = 0; i < N + 1; i++) { s[i] = num * A + jinwei; jinwei = s[i] / 10; s[i] = s[i] % 10; num--; } for (int i = N; i >= 0; i--) { if (s[i] != 0) { weishu = i; break; } } for (int i = weishu; i >= 0; i--) { printf("%d", s[i]); } return 0; }
7-17 出租
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,
index
数组就是arr
数组的下标,index[0]=2
对应arr[2]=1
,index[1]=0
对应arr[0]=8
,index[2]=3
对应arr[3]=0
,以此类推…… 很容易得到电话号码是18013820100
。本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。
输入格式:
输入在一行中给出一个由11位数字组成的手机号码。
输出格式:
为输入的号码生成代码的前两行,其中
arr
中的数字必须按递减顺序给出。输入样例:
18013820100
输出样例:
int[] arr = new int[]{8,3,2,1,0}; int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
代码如下
#include<stdio.h> int main() { char num[12]; int arr[10]={0}; scanf("%s",num); int count = 0; for(int i =0;i<11;++i) { if(arr[num[i]-'0']==0) { arr[num[i]-'0']=1; count++; } } int nums[count]; printf("int[] arr = new int[]{"); int j =-1; for(int i =9;i>=0;--i) { if(arr[i]==1) { nums[++j]=i; printf("%d",i); if(j<count-1) printf(","); } } printf("};\nint[] index = new int[]{"); for(int j = 0;j<11;++j) { for(int i = 0;i<count;++i) { if((num[j]-'0')==nums[i]) { printf("%d",i); if(j<10) printf(","); } } } printf("};\n"); return 0; }
7-18 反向数相加
反向数是将一个阿拉伯数字按相反的次序写。把第一个数字写成最后一个数字,依次类推。 例如, 1245的反向数为5421。请注意,数字所有的前导零要被省略,所以,如果数字结尾有零,写反向数时零被略去(例如,1200的反向数是21)。还要注意反向数没有零结尾。
你的任务是将两个反向数相加,并输出它们的反向和。当然,结果不是唯一的,因为一个数可以是几个数的反向形式(例如21在反向前可以是12,120 或1200)。为此,本题设定没有0因为反向而丢失(例如,设定原来的数是12)。输入格式:
输入由N个测试用例组成。输入的第一行仅给出正整数N,然后给出测试用例。每个测试用例一行,由2个由空格分开的正整数组成,这是要反向相加的数。
输出格式:
对每个测试用例,输出一行,仅包含一个整数,将两个反向数进行求和,之后再反向。在输出时把前导0略去。
输入样例:
3 24 1 4358 754 305 794
输出样例:
34 1998 1
代码如下
#include <stdio.h> int backshu(int num) { int ret = 0; while(num>0) { ret = ret * 10 + num % 10; num /= 10; } return ret; } int main() { int N; scanf("%d", &N); for (int i = 0; i < N; i++) { int num1,num2; scanf("%d %d", &num1, &num2); int ret1 = backshu(num1); int ret2 = backshu(num2); int sum = ret1 + ret2; int backsum = backshu(sum); printf("%d\n", backsum); } return 0; }
7-19 一帮一
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数
N
(≤50),即全班学生的人数。此后N
行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8 0 Amy 1 Tom 1 Bill 0 Cindy 0 Maya 1 John 1 Jack 0 Linda
输出样例:
Amy Jack Tom Linda Bill Maya Cindy John
代码如下
#include<stdio.h> struct Student { int sex; char name[9]; }stu[50] = {0}; int main() { int n; scanf("%d",&n); for(int i=0;i<n;++i) { scanf("%d %s",&stu[i].sex,stu[i].name); } for(int i=0;i<n;++i) { for(int j=n-1;j>i;--j) { if(stu[i].sex!=stu[j].sex && stu[j].sex!=-1) { printf("%s %s\n",stu[i].name,stu[j].name); stu[j].sex=-1; break; } } } return 0; }
7-20 连续因子
分数 300
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按
因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。输入样例:
630
输出样例:
3 5*6*7
代码如下
#include<stdio.h> #include<math.h> int main() { int n = 0; scanf("%d",&n); for(int len=12;len>0;--len) { for(int start = 2;start<=sqrt(n);++start) { int sum = 1; for(int i =start ;i<len+start;++i) { sum*=i; } if(n%sum==0) { printf("%d\n%d",len,start); for(int k = start+1;k<len+start;++k) { printf("*%d",k); } return 0; } } } printf("1\n%d",n); return 0; }