如果喜欢大家还希望给个收藏点赞呀0.0
相关知识点大家没基础的还是要看一下的,链接:
《算法笔记知识点记录》第三章——入门模拟
由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大家请前往相应的网站查看题目呀0.0
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
📔源码地址:https://gitee.com/xingleigao/algorithm-notes
⏳全文大约阅读时间: 30min
全文目录
- 🍕3.1小节——入门模拟->简单模拟
- 问题 A: 剩下的树
- 问题 B: A+B
- 问题 C: 特殊乘法
- 问题 D: 比较奇偶数个数
- 问题 E: Shortest Distance (20)
- 问题 F: A+B和C (15)
- 问题 G: 数字分类 (20)
- 问题 H: 部分A+B (15)
- 问题 I: 锤子剪刀布 (20)
- B1001 害死人不偿命的(3n+1)猜想 (15 分)
- 1011 A+B 和 C (15 分)
- 1046 划拳 (15 分)
- 1008 数组元素循环右移问题 (20 分)
- B1012 数字分类 (20 分)
- B1018 锤子剪刀布 (20 分)
- A1042 Shuffling Machine (20 分)
- A1046 Shortest Distance (20 分)
- A1065 A+B and C (64bit) (20 分)
- B1010 一元多项式求导 (25 分)
- 1002 A+B for Polynomials (25 分)
- 1009 Product of Polynomials (25 分)
- 🐱🚀3.2小节——入门模拟->查找元素
- 🐱🐉3.3小节——入门模拟->图形输出
- 🐱👤3.4小节——入门模拟->日期处理
- 🐱👤3.5小节——入门模拟->进制转换
- 🐱👤3.6小节——入门模拟->字符串处理
- 问题 A: 字符串连接
- 问题 B: 首字母大写
- 问题 C: 字符串的查找删除
- 问题 D: 单词替换
- 问题 E: 字符串去特定字符
- 问题 F: 数组逆置
- 问题 G: 比较字符串
- 问题 H: 编排字符串
- 问题 I: 【字符串】回文串
- 1006 换个格式输出整数 (15 分)
- 1021 个位数统计 (15 分)
- 1031 查验身份证 (15 分)
- 1002 写出这个数 (20 分)
- 1009 说反话 (20 分)
- 1014 福尔摩斯的约会 (20 分)
- 1024 科学计数法 (20 分)
- 1048 数字加密 (20 分)
- 1001 A+B Format (20 分)
- 1005 Spell It Right (20 分)
- 1035 Password (20 分)
- 1077 Kuchiguse (20 分)
- 1082 Read Number in Chinese (25 分)
🍕3.1小节——入门模拟->简单模拟
地址合集:3.1小节——入门模拟->简单模拟
问题 A: 剩下的树
解题思路
读入L和M的值,只要L和M不全为0就进行循环计算,然后模拟就是
- 先把所有的端点都标记为有树**(利用memset直接标记,大家可以想想为啥为这里可以设置为1而int不可以)**
- 读入区间后把所有的区间内元素设置为没有树并统计少了几棵树。
#include<cstdio>
#include<cstring>
int main(){
int L, M;
while(scanf("%d %d",&L,&M) && (L !=0 || M != 0)){
bool temp[L+1];
memset(temp,1,sizeof(temp));
int ans = L + 1;
while(M--){
int a, b;
scanf("%d %d", &a, &b);
while(a <= b){
if(temp[a]) ans--,temp[a] = 0;
a++;
}
}
printf("%d\n",ans);
}
return 0;
}
问题 B: A+B
解题思路
整个过程最重要的就是将字符串转化为整数。
- 读入两个字符串
- 将两个字符串转化为整数
2.1 判断符号 如果有符号先跳过
2.2 依次读入数字并跳过,
2.3 根据第一位符号来反转(这题没出int的负数比正数多一个的问题,不然更恶心)- 返回结果
#include<cstdio>
int string_to_num(char *s){
int i = 0, ans = 0;
if(s[i] == '-') i++;
for(;s[i] != '\0';i++){
if(s[i] == ',') continue;
ans *= 10;
ans += s[i] - '0';
}
if(s[0] == '-') ans = -ans;
return ans;
}
int main(){
char a[14],b[14];
while(scanf("%s %s", a, b) != EOF){
printf("%d\n",string_to_num(a) + string_to_num(b));
}
return 0;
}
问题 C: 特殊乘法
解题思路
整个过程最重要的就是将取出每一位的数据,这里经常采用的就是不断除以10取余数的方式。有点像转换成二进制的每一位的方式。除留余数法。
#include<cstdio>
int matix(int a, int b){
int ans = 0;
while(a){
int tempa = a % 10;
a /= 10;
int temp = b;
while(b){
ans += tempa * (b % 10);
b /= 10;
}
b = temp;
}
return ans;
}
int main(){
int a, b;
while(scanf("%d %d", &a, &b) != EOF){
printf("%d\n",matix(a, b));
}
return 0;
}
问题 D: 比较奇偶数个数
解题思路
在输入过程中不断统计奇数的个数
- 如果最终的奇数个数超过了总数的一半 就输出YES
- 否则输出NO
#include<cstdio>
int main(){
int n;
while(scanf("%d",&n) != EOF){
int tempn = n,ans = 0;
while(n--){
int temp;
scanf("%d", &temp);
if(temp & 1) ans++; //统计奇数个数
}
if(ans > tempn /2) //奇数比较多
printf("YES\n");
else printf("NO\n");
}
return 0;
}
问题 E: Shortest Distance (20)
解题思路
真的好花里胡哨啊。。。。就是需要计算走那边更近,需要借助前缀和,直接看吧。。思想不复杂。
#include<cstdio>
int main(){
int n;
while(scanf("%d",&n) != EOF){
int temp[n+1];
temp[0] = 0;
for(int i = 0;i < n;i++){
int tempa;
scanf("%d",&tempa);
temp[i+1] = temp[i] + tempa;//计算前缀和
}
int m;
scanf("%d",&m);
while(m--){
int a, b;
scanf("%d %d",&a,&b);
int ans;
if(a > b) ans = temp[a - 1] - temp[b - 1];
else ans = temp[b - 1] - temp[a - 1];
if(2 * ans > temp[n]) ans = temp[n] - ans;
printf("%d\n",ans);
}
}
return 0;
}
问题 F: A+B和C (15)
解题思路
注意数据范围所以直接开到
long long
的数据了,另外注意序号是从1开始的,而变量一般是从0开始循环!
#include<cstdio>
int main(){
int n;
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n; ++i){
long long a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
if(a + b > c)
printf("Case #%d: true\n",i+1);
else
printf("Case #%d: false\n",i+1);
}
}
return 0;
}
问题 G: 数字分类 (20)
解题思路
从一开始模拟整个过程就好了,没那么复杂。
#include<cstdio>
int main(){
int n;
while(scanf("%d",&n) != EOF){
bool flag[5] = {0},flag1= 0;
int a[5] = {0};
double a3 = 0;
while(n--){
int temp;
scanf("%d", &temp);
switch(temp % 5){
case 0:
if(temp % 2 == 0) a[0] += temp,flag[0] = 1;
break;
case 1:
flag[1] = 1;
if(flag1) a[1] -= temp,flag1 = 0;
else a[1] += temp,flag1 = 1;
break;
case 2:
flag[2] = 1;
a[2]++;
break;
case 3:
flag[3] = 1;
a3 += temp;
a[3] ++;
break;
case 4:
flag[4] = 1;
if(a[4] < temp) a[4] = temp;
break;
default:
break;
}
}
if(a[3]) a3 /= a[3];
for(int i = 0;i < 3;++i)
if(flag[i]) printf("%d ",a[i]);
else printf("N ");
if(a[3]) printf("%.1f ",a3);
else printf("N ");
if(flag[4]) printf("%d\n",a[4]);
else printf("N\n");
}
return 0;
}
问题 H: 部分A+B (15)
解题思路
就是看给定串内有多少个对应元素呗。
为了防止超过数据范围,结果直接用了long long 保存。int就算无符号也最多是8x108左右,不太行。
#include<cstdio>
int main(){
char a[12],b[12];
int da, db;
while(scanf("%s %d %s %d", a, &da, b, &db) != EOF){
long long ansa = 0, ansb = 0;
for(int i = 0;a[i];++i)
if(a[i] == '0' + da) ansa *= 10, ansa += da;
for(int i = 0;b[i];++i)
if(b[i] == '0' + db) ansb *= 10, ansb += db;
printf("%lld\n", ansa + ansb);
}
return 0;
}
问题 I: 锤子剪刀布 (20)
解题思路
这道题,有点复杂。。。。。大概分几步
- 读入数据的同时统计输赢和统计赢得那个人的手势
- 然后按照要求输出酒哈了
注意:输赢信息保存一份就好,输出的时候倒序输出就是另外一个人的信息0.0
#include<cstdio>
int main(){
char ans[4] = "BCJ";
int n, ansa[3], ansb[3], ans_sum[3];
while(scanf("%d",&n) != EOF){
//重置数组
for(int i = 0;i < 3;i++)
ansa[i] = 0 ,ansb[i] = 0, ans_sum[i] = 0;
while(n--){
char tempa,tempb;
scanf("\n%c %c",&tempa,&tempb);
int i,j;
for(i = 0;i < 3;i++)
if(ans[i] == tempa) break;
for(j = 0;j < 3;j++)
if(ans[j] == tempb) break;
if(i + 1 == j || j + 2 == i) ans_sum[0]++,ansa[i]++;
else if(i == j) ans_sum[1] ++;
else ans_sum[2]++,ansb[j]++;
//printf("%c %c %d %d\n",tempa,tempb,i,j);
}
int max1 = 0, max2 = 0;
for(int i = 1;i < 3;i++){
if(ansa[max1] < ansa[i]) max1 = i;
if(ansb[max2] < ansb[i]) max2 = i;
}
printf("%d %d %d\n%d %d %d\n%c %c\n",ans_sum[0],ans_sum[1],ans_sum[2],ans_sum[2],ans_sum[1],ans_sum[0],ans[max1],ans[max2]);
}
return 0;
}
B1001 害死人不偿命的(3n+1)猜想 (15 分)
解题思路
按照要求进行操作并计数就好了。
#include<cstdio>
int main(){
int n, step = 0;
scanf("%d",&n);
while(n != 1){
if(n %2 == 1) n = (3 * n + 1) / 2;
else n = n/2;
step++;
}
printf("%d\n",step);
return 0;
}
1011 A+B 和 C (15 分)
解题思路
因为溢出问题简单的作为
long long
作为输入来进行判定来解决。平时一定要注意输入输出的判定呀。。
#include<cstdio>
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++){
long long a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
a + b > c ? printf("Case #%d: true\n",i + 1) : printf("Case #%d: false\n",i + 1);
}
return 0;
}
1046 划拳 (15 分)
解题思路
根据喊和划的数字来判断是否猜中,然后再根据是否只有一个猜中来增加结果统计。
#include<cstdio>
int main(){
int n,han_a,hua_a,sum_a=0,han_b,hua_b,sum_b=0;
scanf("%d",&n);
while(n--){
scanf("%d %d %d %d",&han_a,&hua_a,&han_b,&hua_b);
if(hua_a==(han_a+han_b)){
if(hua_b!=(han_a+han_b)) sum_b++;
}
else if(hua_b==(han_a+han_b)) sum_a++;
}
printf("%d %d\n",sum_a,sum_b);
return 0;
}
1008 数组元素循环右移问题 (20 分)
解题思路
先将所有元素右移对应的位数,然后再将前m位写回就好了。
#include<cstdio>
int main(){
int n, m;
scanf("%d %d", &n, &m);
m %= n;
int num[n + m];
for(int i = 0;i < n;i++)
scanf("%d",&num[i]);
//双指针移动
for(int i = m + n - 1,j = n - 1;j >= 0;i--,j--)
num[i] = num[j];
for(int i = 0; i < m; i++)//写回
num[i] = num[i + n];
printf("%d",num[0]);
for(int i = 1;i < n;i++)
printf(" %d",num[i]);
puts("");
return 0;
}
B1012 数字分类 (20 分)
解题思路
按照题目要求依次进行数字的统计和最后的输出就好了。
#include<cstdio>
int main(){
int num,A1=0,A2=0,A3=0,A5=0,n,A2_i=2;
float A4=0,A4_num=0;
scanf("%d",&n);
for(int i=0;i<n;++i) {
scanf("%d",&num);
switch(num%5){
case 0:if(num%2==0) A1+=num;break;
case 1:A2_i%2==0?A2+=num:A2-=num;A2_i++;break;
case 2:A3++;break;
case 3:A4_num++;A4+=num;break;
case 4:num>A5?A5=num:A5=A5;break;
}
}
A4=A4/A4_num;
A1>0?printf("%d ",A1):printf("N ");
A2_i>2?printf("%d ",A2):printf("N ");
A3>0?printf("%d ",A3):printf("N ");
A4>0?printf("%.1f ",A4):printf("N ");
A5>0?printf("%d\n",A5):printf("N\n");
return 0;
}
B1018 锤子剪刀布 (20 分)
解题思路
这个题目比较复杂,可以利用字符串来转化所有的出拳为0、1、2然后+1就是对应的输赢位置。
#include<cstdio>
int main(){
char ans[4] = "BCJ";
int n, ansa[3], ansb[3], ans_sum[3];
while(scanf("%d",&n) != EOF){
//重置数组
for(int i = 0;i < 3;i++)
ansa[i] = 0 ,ansb[i] = 0, ans_sum[i] = 0;
while(n--){
char tempa,tempb;
scanf("\n%c %c",&tempa,&tempb);
int i,j;
for(i = 0;i < 3;i++)
if(ans[i] == tempa) break;
for(j = 0;j < 3;j++)
if(ans[j] == tempb) break;
if(i + 1 == j || j + 2 == i) ans_sum[0]++,ansa[i]++;
else if(i == j) ans_sum[1] ++;
else ans_sum[2]++,ansb[j]++;
//printf("%c %c %d %d\n",tempa,tempb,i,j);
}
int max1 = 0, max2 = 0;
for(int i = 1;i < 3;i++){
if(ansa[max1] < ansa[i]) max1 = i;
if(ansb[max2] < ansb[i]) max2 = i;
}
printf("%d %d %d\n%d %d %d\n%c %c\n",ans_sum[0],ans_sum[1],ans_sum[2],ans_sum[2],ans_sum[1],ans_sum[0],ans[max1],ans[max2]);
}
return 0;
}
A1042 Shuffling Machine (20 分)
解题思路
直接做转换,为了将1-13号牌映射到0-12 对所有序号进行-1操作,这样可以利用取余得到花色,最终的序号输出的时候需要进行+1。
#include<cstdio>
const int N=54;
char mp[5]={'S','H','C','D','J'};
int start[N+1],end[N+1],next[N+1];
int main(){
int k;
scanf("%d",&k);
for(int i=1;i<=N;i++) start[i]=i;
for(int i=1;i<=N;i++) scanf("%d",&next[i]);
while(k--) {
for(int i=1;i<=N;++i) end[next[i]]=start[i];
for(int i=1;i<=N;++i) start[i]=end[i];
}
for(int i=1;i<=N;i++){
if(i!=1) printf(" ");
end[i]--;
printf("%c%d",mp[end[i]/13],end[i]%13+1);
}
printf("\n");
return 0;
}
A1046 Shortest Distance (20 分)
解题思路
利用前缀和做简化,优化到O(1)的查询复杂度。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int dis[MAXN],A[MAXN];
int main(){
int sum=0,query,n,left,right;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&A[i]);
sum+=A[i];
dis[i]=sum;//前缀和
}
scanf("%d",&query);
while(query--){
scanf("%d %d",&left,&right);
if(left>right) swap(left,right);
int temp=dis[right-1]-dis[left-1];
printf("%d\n",min(temp,sum-temp));//对比结果输出
}
return 0;
}
A1065 A+B and C (64bit) (20 分)
解题思路
直接计算结果,根据结果和原始数据的情况来进行溢出判断,生成最终的结果。
#include<cstdio>
int main(){
int T,tcase=1;
scanf("%d",&T);
while(T--){
long long a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
long long res=a+b;
bool flag;
if(a>0&&b>0&&res<0) flag=true;//上溢 必然大于
else if(a<0&&b<0&&res>=0) flag=false; //下溢必然小于
else if(res>c) flag=true;//无溢出正常比较
else flag=false;
flag==true?printf("Case #%d: true\n",tcase++):printf("Case #%d: false\n",tcase++);
}
return 0;
}
B1010 一元多项式求导 (25 分)
解题思路
其实就是很简单的公式,但是注意特殊情况,另外,这道题的判定方式应该是多次运行的。所以没加多余的!= EOF。
#include<cstdio>
int main(){
int n=1,a,e;
while(scanf("%d %d",&a,&e)!=EOF){
if(e!=0){
if(n!=1){
printf(" ");
}
printf("%d %d",a*e,e-1);
n++;
}
}
if(n==1) printf("0 0");
printf("\n");
return 0;
}
1002 A+B for Polynomials (25 分)
解题思路
直接用hash表来存储对应指数的系数就好了,不复杂。
#include<cstdio>
const int max_n=1111;
double p[max_n]={0};
int main(){
int k,n,count=0;
double a;
scanf("%d",&k);
count+=k;
for(int i=0;i<k;i++){
scanf("%d %lf",&n,&a);
p[n]+=a;
}
scanf("%d",&k);
count+=k;
for(int i=0;i<k;i++){
scanf("%d %lf",&n,&a);
if(p[n]!=0) count--;
p[n]+=a;
if(p[n]==0) count--;
}
printf("%d",count);
for(int i=max_n;i>=0;i--)
if(p[i]!=0)
printf(" %d %.1f",i,p[i]);
printf("\n");
return 0;
}
1009 Product of Polynomials (25 分)
解题思路
接收所有的第一个的指数和系数,第二个每次接收的时候都和之前的所有数相乘等到结果保存到ans就好了。
#include<cstdio>
struct Poly{
int exp;//指数
double cof;//系数
}Poly[1001];
double ans[2001]={0.0};
int main(){
int n,m,number=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d %lf",&Poly[i].exp,&Poly[i].cof);
scanf("%d",&m);
for(int i=0;i<m;i++){
int exp;
double cof;
scanf("%d %lf",&exp,&cof);
for(int j=0;j<n;j++) {
if(ans[exp+Poly[j].exp]==0.0) number++;
ans[exp+Poly[j].exp]+=(cof*Poly[j].cof);
if(ans[exp+Poly[j].exp]==0.0) number--;
}
}
printf("%d",number);
for(int i=2000;i>=0;--i){
if(ans[i]!=0.0) printf(" %d %.1f",i,ans[i]);
}
printf("\n");
}
🐱🚀3.2小节——入门模拟->查找元素
地址合集:3.2小节——入门模拟->查找元素
问题 A: 统计同成绩学生人数
解题思路
每次读入对应的数组,从前往后进行查找统计就完事了呗。
#include<cstdio>
const int maxn=1000;
int a[maxn];
int main(){
int n,x;
while(scanf("%d",&n) != EOF && n != 0){
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
}
scanf("%d",&x);
int count=0;
for(int i=0;i<n;i++)
if(a[i]==x)
count++;
printf("%d\n",count);
}
return 0;
}
问题 B: 找x
#include<cstdio>
const int maxn=210;
int a[maxn];
int main(){
int n,x;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
}
scanf("%d",&x);
int k;
for(k=0;k<n;k++)
if(a[k]==x) {
printf("%d\n",k);
break;
}
if(k==n) printf("-1\n");
}
return 0;
}
问题 C: 查找学生信息
#include<cstdio>
#include<cstring>
using namespace std;
const int max=1010;
struct student{
char id[100];
char name[100];
char sex[2];
int age;
}stu[max];
int main(){
int n,m,flag;
char temp[4];
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;++i) scanf("%s%s%s%d",&stu[i].id,&stu[i].name,&stu[i].sex,&stu[i].age);
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%s",temp);
flag=-1;
for(int j=0;j<n;j++){ if(strcmp(stu[j].id,temp)==0) flag=j;}
flag==-1?printf("No Answer!\n"):printf("%s %s %s %d\n",stu[flag].id,stu[flag].name,stu[flag].sex,stu[flag].age);
}
}
return 0;
}
问题 D: 查找
#include<cstdio>
int main(){
int n,m,temp;
while(scanf("%d",&n)!=EOF){
int a[n];
for(int i=0;i<n;++i) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;++i){
scanf("%d",&temp);
for(int j=0;j<n;++j){
if(a[j]==temp){
printf("YES\n");
break;
}
else if(j==n-1) printf("NO\n");
}
}
}
return 0;
}
问题 E: 学生查询
#include<cstdio>
#include<cstring>
struct student{
char id[20];
char name[20];
char sex[10];
int age;
}stu[20];
int main(){
int m,n;
char temp[20];
scanf("%d",&m);
for(int i=0;i<m;++i){
scanf("%d",&n);
for(int j=0;j<n;++j){
scanf("%s %s %s %d",&stu[j].id,&stu[j].name,&stu[j].sex,&stu[j].age);
}
scanf("%s",&temp);
for(int j=0;j<n;++j){
if(strcmp(temp,stu[j].id)==0){
printf("%s %s %s %d\n",stu[j].id,stu[j].name,stu[j].sex,stu[j].age);
break;
}
}
}
return 0;
}
1041 考试座位号 (15 分)
#include<cstdio>
typedef struct {
char id[16];
int jishi;
int kaoshi;
}student;
int main(){
int n,chan,cha;
scanf("%d",&n);
student stu[n];
for(int i=0;i<n;++i) scanf("%s %d %d",&stu[i].id,&stu[i].jishi,&stu[i].kaoshi);
scanf("%d",&chan);
while(chan--){
scanf("%d",&cha);
for(int i=0;i<n;++i)
if(stu[i].jishi==cha) printf("%16.16s %d\n",stu[i].id,stu[i].kaoshi);
}
return 0;
}
1004 成绩排名 (20 分)
地址: 1004 成绩排名 (20 分)
#include<cstdio>
#include<cstring>
int main(){
int n,high=-1,low=101,score;
char h_name[11],h_id[11],l_name[11],l_id[11],name[11],id[11];
scanf("%d",&n);
while(n--){
scanf("%s%s%d",&name,&id,&score);
if(score>high) {strcpy(h_name,name);strcpy(h_id,id);high=score;}
if(score<low) {strcpy(l_name,name);strcpy(l_id,id);low=score;}
}
printf("%s %s\n%s %s\n",h_name,h_id,l_name,l_id);
return 0;
}
1028 人口普查 (20 分)
#include<cstdio>
#include<cstring>
int main(){
int n,youxiao=0;
scanf("%d",&n);
char minStr[12]="9",minName[6]="",maxStr[12]="0",maxName[6]=" ",start[12]="1814/09/06",end[12]="2014/09/06",name[6],str[12];
while(n--){
scanf("%s %s",&name,&str);
if(strcmp(str,start)>=0&&strcmp(str,end)<=0){//判断边界
youxiao++;
if(strcmp(minStr,str)>=0) {strcpy(minStr,str);strcpy(minName,name);}
if(strcmp(maxStr,str)<=0) {strcpy(maxStr,str);strcpy(maxName,name);}
}
}
youxiao>0?printf("%d %s %s\n",youxiao,minName,maxName):printf("0\n");
return 0;
}
1032 挖掘机技术哪家强 (20 分)
#include<cstdio>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
int n, schID, score;
scanf("%d", &n);
for(int i = 0;i < n;i++){
scanf("%d %d", &schID, &score);
school[schID] += score;
}
int MAX = -1, k = 0;
for(int i = 1;i <= n;i++){
if(school[i] > MAX){
MAX = school[i];
k = i;
}
}
printf("%d %d\n", k, MAX);
return 0;
}
1006 Sign In and Sign Out (25 分)
#include<cstdio>
#include<cstring>
int main(){
char id[16],signin[9],signout[9],firstId[16],firstSignin[9]="9",lastId[16],lastSignout[9]="00:00:00";
int n;
scanf("%d",&n);
while(n--){
scanf("%s %s %s",&id,&signin,&signout);
if(strcmp(signin,firstSignin)<=0) {strcpy(firstId,id);strcpy(firstSignin,signin);}
if(strcmp(signout,lastSignout)>=0){strcpy(lastId,id);strcpy(lastSignout,signout);}
}
printf("%s %s\n",firstId,lastId);
return 0;
}
1011 World Cup Betting (20 分)
#include<cstdio>
const char name[3]={'W','T','L'};
int compy(double a,double b,double c){
if(a>b){
if(a>c) return 0;
else return 2;
}
else{
if(b>c) return 1;
else return 2;
}
}
int main(){
double game[3],fine=1.0;
for(int i=0;i<3;i++){
scanf("%lf%lf%lf",&game[0],&game[1],&game[2]);
int win=compy(game[0],game[1],game[2]);
printf("%c ",name[win]);
fine*=game[win];
}
fine=(fine*0.65-1)*2;
printf("%.2f\n",fine);
return 0;
}
1036 Boys vs Girls (25 分)
#include<cstdio>
#include<cstring>
struct people{
char name[11];
char gender;
char id[11];
int grade;
}highf={" ",'F'," ",-1},lowm={" ",'M'," ",101},temp;
int main(){
int n;
scanf("%d",&n);
while(n--){
scanf("%s %c %s %d",&temp.name,&temp.gender,&temp.id,&temp.grade);
if(temp.gender=='F'){
if(temp.grade>=highf.grade) highf=temp;
}
else {
if(temp.grade<=lowm.grade) lowm=temp;
}
}
highf.grade>-1?printf("%s %s\n",highf.name,highf.id):printf("Absent\n");
lowm.grade<101?printf("%s %s\n",lowm.name,lowm.id):printf("Absent\n");
if(highf.grade>-1&&lowm.grade<101) printf("%d\n",highf.grade-lowm.grade);
else printf("NA\n");
return 0;
}
🐱🐉3.3小节——入门模拟->图形输出
地址合集:3.3小节——入门模拟->图形输出
问题 A: 输出梯形
#include<cstdio>
int main(){
int h;
while(scanf("%d",&h)!=EOF){
for(int i=0;i<h;++i){
for(int j=0;j<3*h-2;j++){
if(j<2*(h-i)-2) printf(" ");
else printf("*");
}
printf(" \n");
}
}
return 0;
}
问题 B: Hello World for U
#include<cstdio>
#include<cstring>
int main(){
char s[82];
scanf("%s",s);
int len=strlen(s),n1=(len+2)/3,n2=len-2*n1+2;
for(int i=0;i<n1-1;++i){
printf("%c",s[i]);
for(int j=0;j<n2-2;++j) printf(" ");
printf("%c\n",s[len-i-1]);
}
for(int i=0;i<n2;++i) printf("%c",s[n1-1+i]);
printf("\n");
return 0;
}
问题 C: 等腰梯形
#include<cstdio>
int main(){
int n;
scanf("%d",&n);
for(int k=0;k<n;k++){
int h;
scanf("%d",&h);
for(int i=0;i<h;++i){
for(int j=0;j<h-1-i;j++) printf(" ");
for(int j=0;j<h+2*i;j++) printf("*");
for(int j=0;j<h-1-i;j++) printf(" ");
printf("\n");
}
}
return 0;
}
问题 D: 沙漏图形
#include<cstdio>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
for(int j=0;j<i;j++) printf(" ");
for(int j=0;j<n-i-1;j++) printf("* ");
printf("*\n");
}
for(int i=1;i<n;i++){
for(int j=0;j<n-i-1;j++) printf(" ");
for(int j=0;j<i;j++) printf("* ");
printf("*\n");
}
}
return 0;
}
1036 跟奥巴马一起编程 (15 分)
#include<cstdio>
int main(){
int n,n2;
char s;
scanf("%d %c",&n,&s);
n2=(n+1)/2;
//printf("%d",n2);
for(int i=0;i<n2;i++){
for(int j=0;j<n;j++){
if(i==0||i==n2-1) printf("%c",s);
else{
if(j==0||j==n-1) printf("%c",s);
else printf(" ");
}
}
printf("\n");
}
return 0;
}
1027 打印沙漏 (20 分)
#include<cstdio>
int how(int a){
a=(a+1)/2;
for(int i=0;i<a+2;i++) if((i*i)>a) return i-1;
return 0;
}
int main(){
int h;
char s;
scanf("%d %c",&h,&s);
int n=how(h);
//printf("%d",n);
for(int i=0;i<n;i++){
for(int j=0;j<i;j++) printf(" ");
for(int j=0;j<2*(n-i)-1;j++) printf("%c",s);
printf("\n");
}
for(int i=1;i<n;i++){
for(int j=0;j<n-i-1;j++) printf(" ");
for(int j=0;j<2*i+1;j++) printf("%c",s);
printf("\n");
}
printf("%d\n",h-2*n*n+1);
return 0;
}
1031 Hello World for U (20 分)
#include<cstdio>
char M[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
int quan[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main(){
int n;
bool flag = true;
while(scanf("%d",&n) != EOF){
while(n--){
bool flag1 = true;
char num[19];
int sum = 0,i;
scanf("%s", num);
for(i = 0; i < 17; ++i)
if(num[i] <= '9' &&num[i] >= '0')
sum += quan[i]*(num[i] - '0');
else
break;
if(M[sum % 11] == num[17] && i == 17){
continue;
printf("N");
}
if(flag){
printf("%s",num);
flag1 = false;
}
else printf("\n%s",num);
flag = false;
}
if(flag)
printf("All passed");
}
return 0;
}
🐱👤3.4小节——入门模拟->日期处理
地址合集:3.4小节——入门模拟->日期处理
问题 A: 日期差值
#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(scanf("%d %d",&time1,&time2)!=EOF){
if(time1>time2){
int temp=time1;
time1=time2;
time2=temp;
}
y1=time1/10000;m1=time1%10000/100;d1=time1%100;
y2=time2/10000;m2=time2%10000/100;d2=time2%100;
int ans=1;
while(y1<y2||m1<m2||d1<d2){
d1++;
if(d1==month[m1][isLeap(y1)]+1){
m1++;
d1=1;
}
if(m1==13){
y1++;
m1=1;
}
ans++;
}
printf("%d\n",ans);
}
return 0;
}
问题 B: Day of Week
#include<cstdio>
#include<cstring>
char week[7][20]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int year[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
char month[12][20]={"January","February","March","April","May","June","July","August","September","October","November","December"};
bool isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
};
int toMonth(char m[20]){
for(int i=0;i<13;i++) if(strcmp(m,month[i])==0) return i+1;
return 0;
}
int main(){
int time1,y1,m1,d1;
char m[20];
int time2,y2,m2,d2;
while(scanf("%d %s %d",&d1,&m,&y1)!=EOF){
m1=toMonth(m);
int flag=0;
time1=d1+m1*100+y1*10000;
int ans=0;
if(time1>20130107){
time2=time1;
time1=20130107;
flag=1;
}
else time2=20130107;
y1=time1/10000;m1=time1%10000/100;d1=time1%100;
y2=time2/10000;m2=time2%10000/100;d2=time2%100;
//printf("%d %d %d",y1,m1,d1);
//printf("%d %d %d",y2,m2,d2);
while(y1<y2||m1<m2||d1<d2){
d1++;
if(d1==year[m1][isLeap(y1)]+1){
m1++;
d1=1;
}
if(m1==13){
y1++;
m1=1;
}
ans++;
}
//printf("%d %d",ans,flag);
flag==0?printf("%s\n",week[6-(ans-1)%7]):printf("%s\n",week[ans%7]);
}
return 0;
}
问题 C: 打印日期
#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
int isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
int y,m,d;
while(scanf("%d %d",&y,&d)!=EOF){
int le=isLeap(y);
//printf("%d",le);
int ans=1;
m=1;
while(d>month[m][le]){
d-=month[m][le];
m++;
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}
问题 D: 日期类
#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
int isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
int y,m,d,n;
scanf("%d",&n);
while(n--){
scanf("%d %d %d",&y,&m,&d);
int le=isLeap(y);
d++;
int ans=1;
if(d>month[m][le]){
d-=month[m][le];
m++;
}
if(m>12){
y++;
m-=12;
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}
问题 E: 日期累加
#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
int isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
int y,m,d,n,sum;
scanf("%d",&n);
while(n--){
scanf("%d %d %d %d",&y,&m,&d,&sum);
while(sum--){
int le=isLeap(y);
d++;
if(d>month[m][le]){
d-=month[m][le];
m++;
}
if(m>12){
y++;
m-=12;
}
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}
🐱👤3.5小节——入门模拟->进制转换
地址合集:3.5小节——入门模拟->进制转换
问题 A: 又一版 A+B
#include <stdio.h>
void change(long long sum,int m){
int stack[32],top = -1;
if(sum == 0)
printf("0");
while(sum){
stack[++top] = sum % m;
sum /= m;
}
while(top >=0)
printf("%d",stack[top--]);
puts("");
}
int main(int argc, const char *argv[]){
int m;
while(scanf("%d" ,&m) != EOF && m!=0){
int a, b;
scanf("%d %d", &a, &b);
change((long long)a+b, m);
}
return 0;
}
问题 B: 数制转换
#include<stdio.h>
#include<string.h>
char zimu[17] = "0123456789ABCDEF";
long long atoi(char *a, int b){
long long num = 0;
for(int i = 0;a[i];++i){
if(a[i] >= '0' && a[i] <= '9')
num *= b, num += a[i] - '0';
else if(a[i] >= 'a' && a[i] <= 'z')
num *= b, num += a[i] - 'a' + 10;
else
num *= b, num += a[i] - 'A' + 10;
}
return num;
}
void itoa(long long num , char *a, int c){
int anum = 0;
if(num == 0){
a[anum++] = '0',a[anum++] = '\0';
return;
}
while(num){
a[anum++] = zimu[num % c];
num /= c;
}
a[anum++] = '\0';
int len = strlen(a);
for(int i = 0;i < len/2; ++i){
char temp = a[i];
a[i] = a[len - 1 - i];
a[len - 1 - i] = temp;
}
}
int main(){
char a[100];
int b, c;
while(scanf("%d %s %d",&b, a, &c) != EOF){
long long num = atoi(a, b);
itoa(num, a, c);
printf("%s\n",a);
}
return 0;
}
问题 C: 进制转换
#include <cstdio>
#include <cstring>
int main(){
char orgin[32], change[120];
int orgin_len,change_len, k = 2;//k代表进制
while(scanf("%s", orgin) != EOF){
orgin_len = strlen(orgin);
change_len = 0;
if(orgin_len == 1 && orgin[0] == '0'){
printf("0\n");
break;
}//0的特殊处理
while(1){
change[change_len++] = (orgin[orgin_len - 1] - '0' )% k + '0';//取出最低位
int jinwei = 0;
for(int i = 0;i < orgin_len;++i){
int temp = (jinwei * 10 + orgin[i] - '0') % k;
orgin[i] = (jinwei * 10+ orgin[i] - '0') / k + '0';
jinwei = temp;
}
int flag = 0;
for(int i = 0;i < orgin_len;++i)
if(orgin[i] != '0') flag = 1;
if(!flag)
break;
}
for(int i = change_len - 1;i >= 0;--i)
printf("%c",change[i]);
puts("");
}
return 0;
}
问题 D: 八进制
#include <stdio.h>
#include <string.h>
int main(){
int orgin ,conversize;
char change[20];
while(scanf("%d",&orgin) != EOF){
conversize = 0;
if(orgin == 0) change[conversize++] = '0';
while(orgin){
change[conversize++] = orgin % 8 + '0';
orgin /= 8;
}
for(int i = conversize - 1; i >= 0;i--){
putchar(change[i]);
}
puts("");
}
return 0;
}
1022 D进制的A+B (20 分)
#include<cstdio>
int main(){
int a, b, d;
scanf("%d %d %d", &a, &b, &d);
int sum = a + b;
int ans[31], num = 0; //ans存放d进制的没一位
do{
ans[num++] = sum % d;
sum /= d;
}while(sum != 0);
for(int i = num - 1;i >= 0;i--)
printf("%d",ans[i]);
puts("");
return 0;
}
1037 在霍格沃茨找零钱 (20 分)
#include<cstdio>
const int Galleon = 17 * 29;
const int Sickle = 29;
int main(){
int a1, a2, a3, b1, b2, b3;
scanf("%d.%d.%d %d.%d.%d",&a1, &a2, &a3, &b1, &b2, &b3);
int price = a1 * Galleon + a2 * Sickle + a3;
int money = b1 * Galleon + b2 * Sickle + b3;
int change = money - price;
if(change < 0){
printf("-");
change = - change;
}
printf("%d.%d.%d\n",change / Galleon, change % Galleon / Sickle, change % Sickle);
return 0;
}
1019 General Palindromic Number (20 分)
#include<cstdio>
int change(int y, int q, int *z){
int num = 0;
do{
z[num++] = y % q;
y /= q;
}while(y != 0);
return num;
}
bool Judge(int z[], int num){
for(int i = 0; i < num / 2; ++i)
if(z[i] != z[num - i - 1])
return false;
return true;
}
int main(){
int K, b;
while(scanf("%d", &K) != EOF){
scanf("%d", &b);
int z[40];
int num = change(K, b, z);
Judge(z, num)?puts("Yes"):puts("No");
for(int i = num - 1; i > 0; --i) printf("%d ",z[i]);
printf("%d\n",z[0]);
}
return 0;
}
1027 Colors in Mars (20 分)
#include<cstdio>
int how(int a){
a=(a+1)/2;
for(int i=0;i<a+2;i++) if((i*i)>a) return i-1;
return 0;
}
int main(){
int h;
char s;
scanf("%d %c",&h,&s);
int n=how(h);
//printf("%d",n);
for(int i=0;i<n;i++){
for(int j=0;j<i;j++) printf(" ");
for(int j=0;j<2*(n-i)-1;j++) printf("%c",s);
printf("\n");
}
for(int i=1;i<n;i++){
for(int j=0;j<n-i-1;j++) printf(" ");
for(int j=0;j<2*i+1;j++) printf("%c",s);
printf("\n");
}
printf("%d\n",h-2*n*n+1);
return 0;
}
1058 A+B in Hogwarts (20 分)
#include<cstdio>
int main(){
int Galleon, Sickle, Knut,Galleon1, Sickle1, Knut1;
scanf("%d.%d.%d",&Galleon, &Sickle, &Knut);
scanf("%d.%d.%d",&Galleon1, &Sickle1, &Knut1);
int carry = 0;
carry = (Knut + Knut1) / 29;
Knut = (Knut + Knut1) % 29;
int carry1 = 0;
carry1 = (Sickle + Sickle1 + carry) / 17;
Sickle = (Sickle + Sickle1 + carry) % 17;
Galleon = Galleon + Galleon1 + carry1;
printf("%d.%d.%d\n",Galleon, Sickle, Knut);
return 0;
}
🐱👤3.6小节——入门模拟->字符串处理
地址合集:3.6小节——入门模拟->字符串处理
问题 A: 字符串连接
#include<cstdio>
int main(){
char s[2][101];
int n = 0;
while(scanf("%s",s[n])!=EOF){
n++;
if(n == 2){
printf("%s%s\n",s[0],s[1]);
n = 0;
}
}
return 0;
}
问题 B: 首字母大写
#include<cstdio>
int main(){
int num = 0;
char ans[90][90];
while(scanf("%s",ans[num]) != EOF)
num++;
for(int i = num -1;i >= 0; --i)
i == 0 ? printf("%s\n",ans[i]):printf("%s ",ans[i]);
}
问题 C: 字符串的查找删除
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
string a;
string b;
cin>>a;
for(int i = 0; i < a.size(); ++i)
a[i] = tolower(a[i]);
getchar();
while(getline(cin,b)){
//cout<<a;
//cout<<b<<endl;
for(int i = 0; i< b.size();i++){
if(b[i] == ' ') continue;
if(b[i] == a[0]||b[i] == toupper(a[0])){
int j =1;
i++;
for(j = 1 ;j< a.size()&&i<b.size();){
if(b[i] == a[j]||b[i] == toupper(a[j])){
i++;
j++;
}
else break;
}
if(j != a.size()){
//cout<<'1'<<endl;
i-=j;
}
else{
i--;
continue;
}
}
putchar(b[i]);
}
cout<<endl;
}
return 0;
}
问题 D: 单词替换
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
string s,a,b;
while(getline(cin,s)){
getline(cin,a);
getline(cin,b);
for(int i = 0; i < s.size(); ++i){
//printf("%d %d\n",s.size(),a.size());
int j =0;
while(s[i]==a[j]&&j<a.size()&&i<s.size()){
i++;
j++;
}
if(j==a.size()){
i--;
printf("%s",b.c_str());
}
else{
i -=j;
putchar(s[i]);
}
}
printf("\n");
}
return 0;
}
问题 E: 字符串去特定字符
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
string s;
char c;
while(getline(cin,s)){
scanf("%c",&c);
getchar();
for(int i = 0; i < s.size();i++)
if(s[i] != c)
putchar(s[i]);
printf("\n");
}
return 0;
}
问题 F: 数组逆置
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
for(int i =s.size()-1; i >= 0;--i){
putchar(s[i]);
}
printf("\n");
}
return 0;
}
问题 G: 比较字符串
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
char s1[51],s2[51];
scanf("%s %s",s1,s2);
int lena = strlen(s1),lenb = strlen(s2);
if(lena>lenb)
printf("%s is longer than %s\n",s1,s2);
else if (lena == lenb)
printf("%s is equal long to %s\n",s1,s2);
else
printf("%s is shorter than %s\n",s1,s2);
}
return 0;
}
问题 H: 编排字符串
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int m;
char s[4][21];
scanf("%d",&m);
for(int i = 0; i< m ; ++i){
scanf("%s",s[0]);
if( i < 3)
for(int j = 0 ; j <= i ;j++)
printf("%d=%s ",j+1,s[j]);
else
for(int j = 0 ; j <= 3 ;j++)
printf("%d=%s ",j+1,s[j]);
for(int j = 3; j>= 1; j--)
strcpy(s[j],s[j-1]);
printf("\n");
}
return 0;
}
问题 I: 【字符串】回文串
#include <cstdio>
#include <cstring>
int main(){
char s[257];
while(fgets(s, 257, stdin)){
int len = s[strlen(s) - 1] == '\n' ? strlen(s) - 1 : strlen(s);
int flag = 0;
for(int i = 0;i < len /2 ;++i){
if(s[i] != s[len - 1 - i]){
puts("NO");
flag = 1;
break;
}
}
if(flag) continue;
puts("YES");
}
return 0;
}
1006 换个格式输出整数 (15 分)
#include<cstdio>
int main(){
int num, ans[5], wei = 0;
scanf("%d",&num);
//int b = num / 100, s = num % 100 / 10, g = num % 10;
while(num > 0){
ans[wei++] = num % 10;
num /= 10;
}
for(int j= wei - 1; j >= 0; j--)
if(j == 2)
for(int i = 0; i < ans[j]; ++i) printf("B");
else if(j == 1)
for(int i = 0; i < ans[j]; ++i) printf("S");
else if(j == 0)
for(int i = 0; i < ans[j]; ++i) printf("%d", i + 1);
puts("");
return 0;
}
1021 个位数统计 (15 分)
#include<cstdio>
#include<cstring>
int sum[10] = {0};
int main(){
char num[1005];
scanf("%s", num);
for(int i = 0; i < strlen(num); ++i)
sum[num[i] - '0'] ++ ;
for(int i = 0; i < 10; ++i)
if(sum[i])
printf("%d:%d\n",i,sum[i]);
return 0;
}
1031 查验身份证 (15 分)
#include<cstdio>
char M[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
int quan[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main(){
int n;
bool flag = true;
while(scanf("%d",&n) != EOF){
while(n--){
bool flag1 = true;
char num[19];
int sum = 0,i;
scanf("%s", num);
for(i = 0; i < 17; ++i)
if(num[i] <= '9' &&num[i] >= '0')
sum += quan[i]*(num[i] - '0');
else
break;
if(M[sum % 11] == num[17] && i == 17){
continue;
printf("N");
}
if(flag){
printf("%s",num);
flag1 = false;
}
else printf("\n%s",num);
flag = false;
}
if(flag)
printf("All passed");
}
return 0;
}
1002 写出这个数 (20 分)
#include<cstdio>
char shuzibiao[10][5] = {"ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int main(){
char n[101];
scanf("%s",n);
int i = 0,sum = 0,num[3];
while(n[i] != '\0')
sum += n[i++] - '0';
//printf("%d",sum);
if(sum == 0){
printf("ling\n");
return 0;
}
i = 0;
while(sum > 0){
num[i++] = sum % 10;
sum /= 10;
}
for(int j = i-1; j > 0; j--){
printf("%s",shuzibiao[num[j]]);
if(j) printf(" ");
}
puts("");
return 0;
}
1009 说反话 (20 分)
#include<cstdio>
struct Poly{
int exp;//指数
double cof;//系数
}Poly[1001];
double ans[2001]={0.0};
int main(){
int n,m,number=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d %lf",&Poly[i].exp,&Poly[i].cof);
scanf("%d",&m);
for(int i=0;i<m;i++){
int exp;
double cof;
scanf("%d %lf",&exp,&cof);
for(int j=0;j<n;j++) {
if(ans[exp+Poly[j].exp]==0.0) number++;
ans[exp+Poly[j].exp]+=(cof*Poly[j].cof);
if(ans[exp+Poly[j].exp]==0.0) number--;
}
}
printf("%d",number);
for(int i=2000;i>=0;--i){
if(ans[i]!=0.0) printf(" %d %.1f",i,ans[i]);
}
printf("\n");
}
1014 福尔摩斯的约会 (20 分)
//题目本身不复杂,但是要想的情况数贼多,考察的绝对是读题审题能力!!!!
#include <stdio.h>
#include <string.h>
char Day[][5] = {"","MON","TUE","WED","THU","FRI","SAT","SUN"};
int main(){
char a1[70], a2[70], b1[80], b2[80];
while(scanf("%s %s %s %s", a1, a2, b1, b2) != EOF){
int d = 0, hour = -1, min = -1;
for(int i = 0;a1[i] && a2[i];++i){
if(!d && a1[i] == a2[i] && a1[i] >= 'A' && a1[i] <= 'G'){
d = a1[i] - 'A' + 1;
}else if(d && a1[i] == a2[i]&& ((a1[i] >= 'A' && a1[i] <= 'N') || (a1[i] >= '0' && a1[i] <= '9'))){
hour = a1[i] >= 'A' ? a1[i] - 'A' + 10 : a1[i] - '0';
break;
}
}
for(int i = 0;b1[i] && b2[i];++i)
if(b1[i] == b2[i] && ((b1[i] >= 'A' && b1[i] <= 'Z') || (b1[i] >= 'a' && b1[i] <= 'z')) ){
min = i;
break;
}
printf("%s %02d:%02d", Day[d], hour, min);
}
return 0;
}
1024 科学计数法 (20 分)
#include<cstdio>
int main(){
char num[10000];
scanf("%s",num);
if(num[0] == '-') printf("-");
int ewei = 0,e = 0;
for(int i = 0;num[i] != '\0';++i)
if(num[i] == 'E'){
ewei = i;
break;
}
for(int i = ewei + 2;num[i] != '\0';++i)
e = e * 10 + num[i] - '0';
if(e == 0){
for(int i = 1; i < ewei; ++i) printf("%c",num[i]);
}
else{
if(num[ewei + 1] == '-'){
printf("0.");
for(int i = 0;i < e - 1; i++) printf("0");
putchar(num[1]);
for(int i = 3; i < ewei; ++i) printf("%c",num[i]);
}
else{
for(int i = 1;i < ewei; ++i){
if(num[i] == '.') continue;
else printf("%c",num[i]);
if(i == e + 2 && ewei - 3 != e) printf(".");
}
for(int i = 0; i < e - ewei + 3; ++i) printf("0");
}
}
puts("");
return 0;
}
1048 数字加密 (20 分)
#include<cstdio>
#include<cstring>
char s[14] = {"0123456789JQK"};
void reverse(char A[]){
int len = strlen(A);
for(int i = 0; i < len / 2; ++i){
char temp = A[i];
A[i] = A [len - 1 -i];
A[len - 1 - i] = temp;
}
}
int main(){
char A[110],B[110],C[110]={0};
scanf("%s %s", A, B);
reverse(A);
reverse(B);
int lena = strlen(A), lenb = strlen(B), len = lena > lenb ? lena : lenb;
//两串补充到同长度
if(lena > lenb){
for( int i = lenb; i < lena; ++i)
B[i] = '0';
B[lena] = 0;
}
else{
for(int i = lena; i < lenb;++i)
A[i] = '0';
A[lenb] = 0;
}
for(int i = 0; i < len; i++){
if(i % 2 == 0)
C[i] = s[(A[i] + B[i] - '0' - '0')%13];
else
C[i] = B[i] >= A[i] ? (B[i] - A[i] + '0'): (B[i] - A[i] +'9' + 1);
}
reverse(C);
puts(C);
return 0;
}
1001 A+B Format (20 分)
#include<cstdio>
#include<cstring>
int num[10];
int main(){
int a, b, sum;
scanf("%d %d",&a, &b);
sum = a + b;
//printf("%d",sum);
if(sum < 0){
putchar('-');
sum = -sum;
}
int len = 0;
if(!sum) num[len ++] = 0;
while(sum){
num[len ++] = sum % 10;
sum /= 10;
}
for(int i = len -1; i >= 0; --i){
printf("%d",num[i]);
if(i > 0 && i % 3 == 0) putchar(',');
}
puts("");
return 0;
}
1005 Spell It Right (20 分)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char name[10][10] = {"zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int main(){
int sum = 0;
char num[102] = {0};
int sumwei[3];
scanf("%s", num);
for(int i = 0; i < strlen(num); ++i)
sum += num[i] - '0';
//printf("%d",sum);
if(!sum) puts(name[0]);
else{
int i;
for(i = 0; i < 3 && sum ; i++){
sumwei[i] = sum % 10;
sum /= 10;
}
for(--i;i>0; --i)
printf("%s ",name[sumwei[i]]);
printf("%s\n", name[sumwei[0]]);
}
return 0;
}
1035 Password (20 分)
#include<cstdio>
#include<cstring>
using namespace std;
struct student{
char name[12];
char pswd[12];
};
int main(){
int N;
while(scanf("%d",&N) != EOF){
struct student stu[N];
bool flag[N];
int M = 0;
for(int i = 0; i < N; ++i){
flag[i] = true;
scanf("%s %s", stu[i].name, stu[i].pswd);
for(int j = 0; j < strlen(stu[i].pswd); ++j){
if(stu[i].pswd[j] == '1'){
stu[i].pswd[j] = '@';
flag[i] = false;
}
else if(stu[i].pswd[j] == '0'){
stu[i].pswd[j] = '%';
flag[i] = false;
}
else if(stu[i].pswd[j] == 'l'){
stu[i].pswd[j] = 'L';
flag[i] = false;
}
else if(stu[i].pswd[j] == 'O'){
stu[i].pswd[j] = 'o';
flag[i] = false;
}
}
if(flag[i]) M++;
}
if(M == N)
if(N != 1)
printf("There are %d accounts and no account is modified", N);
else printf("There is %d account and no account is modified", N);
else{
printf("%d\n",N - M);
for(int i = 0; i < N; i++)
if(!flag[i])
printf("%s %s\n", stu[i].name,stu[i].pswd);
}
}
return 0;
}
1077 Kuchiguse (20 分)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
void reverse(char* s){
int len = strlen(s);
for(int i = 0; i < len / 2; ++i){
char temp = s[i];
s[i] = s[len - 1 -i];
s[len - 1 - i] = temp;
}
}
int main(int argc, char * argv[]){
int N;
while(scanf("%d", &N) != EOF){
getchar();
char s[N][230];
int min = 230;
for(int i = 0; i < N; ++i){
cin.getline(s[i], 230);
reverse(s[i]);
if(strlen(s[i]) < min) min = strlen(s[i]);
}
int i = 0;
for(i = 0; i < min; ++i){
int j = 0;
for(j = 1; j < N; ++j)
if(s[j][i] != s[0][i]) break;
if(j != N ) break;
}
if(i == 0)
printf("nai\n");
else{
for(int j = i - 1; j >= 0 ;--j)
putchar(s[0][j]);
puts("");
}
}
return 0;
}
1082 Read Number in Chinese (25 分)
#include<cstdio>
#include<cstring>
char danwei[][10] = {"Shi", "Bai", "Qian", "Wan", "Yi"};
char wei[10][10] = {"ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int main(int argc, char * argv[]){
char s[11];
while(scanf("%s", s) != EOF){
int i = 0;
if(s[0] == '-') {
printf("Fu ");
++i;
}
int len = strlen(s);
bool flag = false;
if(i+1 == len){
printf("%s\n",wei[s[i] - '0']);
continue;
}
while(s[i] == '0' && i < len -1) i++;
printf("%s", wei[s[i] - '0']);
if(len - i ==9) printf(" Yi");
else if((len - i) % 4 != 1){
int danwei1 = len - i;
if (danwei1 > 4) danwei1 -= 4;
printf(" %s", danwei[danwei1 - 2]);
}
if(len - i == 5) printf(" Wan");
++i;
for( ; i <len; ++i){
if(s[i] > '0'){
if(flag){
printf(" ling");
flag = false;
}
printf(" %s", wei[s[i] - '0']);
if(len - i ==9) printf(" Yi");
else if((len - i) % 4 != 1){
int danwei1 = len - i;
if (danwei1 > 4) danwei1 -= 4;
printf(" %s", danwei[danwei1 - 2]);
}
}
else{
flag = true;
}
if(len - i == 5) printf(" Wan");
}
puts("");
}
return 0;
}