1001 害死人不偿命的(3n+1)猜想 (15 分)
基础题
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
int main()
{
int n;
int num;
scanf("%d",&n);
for (num = 0; n != 1; )
{
if (n % 2 == 0)
{
n = n / 2;
num++;
}
else
n = n * 3 + 1;
}
printf("%d",num);
return 0;
}
1002 写出这个数 (20 分)
基础题,注意二维字符数组的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
int main()
{
char a[110];//因为最多有10的100次方
scanf("%s",a);
int sum=0;
int len = 0;
int i;
char b[11][10] = { {"ling"},{"yi" }, { "er" }, { "san" }, { "si" }, { "wu" }, { "liu" }, { "qi" }, { "ba" }, { "jiu" }, { "shi" } };
for (i=0; i < strlen(a); i++)
{
sum += a[i]-'0';
}
while (sum != 0)
{
a[len++] = sum % 10;
sum /= 10;
}
for (i = len - 1; i >= 0; i--)
{
printf("%s",b[a[i]]);
if (i != 0)
printf(" ");
}
return 0;
}
1003 我要通过! (20 分)
这题考的是逻辑,设置一个flag,每次输入字符串时flag的初始值设置为1,当检测到字符串不符合要求时,就让flag=0;
最后查看flag的值,根据是1是0决定输出YES或者NO。
符和条件的字符串特征如下:
第一种情况,只有PAT,第二种情况[left个]AP[numA]个AT[right个]A,需要满足right/left=numA,并且numA不为0.
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
int n;
int i,j;
char a[110];
int numA; int left, right;
int len;
int flag;
scanf("%d",&n);
for (i = 0; i < n; i++)
{
numA = 0;
scanf("%s",a);
len = strlen(a);
left = right = 0;
flag = 1;
j = 0;
if (a[0] == 'P')
{
if (a[len - 1] != 'T'||a[j+1]!='A')
flag = 0;
else
for (j++; j < len - 1; j++)
if (a[j] != 'A')
flag = 0;
}
else if (a[0] == 'A')
{
//计算左边的A的个数
for (; a[j] == 'A'; j++)
{
left++;
}
//printf("1left=%d numA=%d right=%d\n", left, numA, right);
if (a[j] == 'P')
{
j++;
for (; a[j] == 'A'; j++)
{
numA++;
}
if (a[j] == 'T')
{
j++;
for (; a[j] == 'A'; j++)
{
right++;
}
//printf("left=%d numA=%d right=%d\n",left,numA,right);
if (numA == 0)
flag = 0;
else if(right / left != numA)
flag = 0;
}
else
flag = 0;
}
else
{
flag = 0;
}
}
else
{
flag = 0;
}
if (flag == 0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
1004 成绩排名 (20 分)
基础结构体+排序
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
//这题可以使用优先队列,或者直接用sort排序
struct student {
char name[15];
char id[15];
int score;
}stu[1010];
bool cmp(student a,student b){
return a.score < b.score;
}
int main()
{
int n;
int i;
scanf("%d",&n);
for (i = 0; i < n; i++)
{
scanf("%s %s %d",stu[i].name,stu[i].id,&stu[i].score);
}
sort(stu, stu + n, cmp);
printf("%s %s\n", stu[n-1].name, stu[n-1].id);
printf("%s %s",stu[0].name,stu[0].id);
return 0;
}
1005 继续(3n+1)猜想 (25 分)
这题设置一个hashtable,如果数据在之前的序列里没有出现过,就把对应的table表设置为0,反之,设置为1。
输入一个数字num[i]后首先判断table表,如果是1,不用计算了因为之前都出现过,如果为0说明前面没有出现过,把之后每一步计算的结果都标为1,最后留下的hashtable中标为0的数就是关键数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int hashtable[110] = { 0 };
int cmp(int temp,int num[],int K)
{
for (int i = 0; i < K; i++)
if (temp == num[i])
return num[i];
return 0;
}
int main()
{
int K, i;
int num[110];//存储每轮输入的数字
int temp;
int ans[110];
int j=0;
int flag;
scanf("%d",&K);
for (i = 0; i < K; i++)
{
scanf("%d", &num[i]);
}
for (i = 0; i < K; i++)
{
if (hashtable[num[i]] == 1)
continue;
temp = num[i];
while(temp!=1)
{
if (temp & 1)
temp = (3 * temp + 1) / 2;
else
temp /= 2;
flag = cmp(temp, num, K);
if (flag)//如果序列包含了前面的某个数,那么前面某个数的flag变为1;
{
hashtable[flag] = 1;
}
}
}
j = 0;
for (i = 0; i < K; i++)
{
if (hashtable[num[i]] == 0)
ans[j++] = num[i];
}
sort(ans, ans + j);
for (j--; j >= 0; j--)
{
printf("%d",ans[j]);
if (j != 0)
printf(" ");
}
return 0;
}
1006 换个格式输出整数 (15 分
基础题
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n;
int i;//循环变量
int temp;
scanf("%d",&n);
temp = n / 100;
for (i = 0; i < temp; i++)
printf("B");
temp = (n - n / 100 * 100) / 10;
for (i = 0; i < temp; i++)
printf("S");
temp = n % 10;
for (i = 1; i <= temp; i++)
printf("%d",i);
return 0;
}
1007 素数对猜想 (20 分)
素数基础题
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
//入门篇-数学问题-素数-使用筛法求素数比较快
const int maxn = 100010;
int prime[maxn], pNum = 0;
int p[maxn] = { 0 };
void Find_Prime()
{
for (int i = 2; i < maxn; i++)
{
if (p[i] == 0)
{
prime[pNum++] = i;
for (int j = i + i; j < maxn; j += i)
p[j] = 1;
}
}
}
int main()
{
int N;
int num = 0;
scanf("%d",&N);
Find_Prime();
for (int j = 0; prime[j + 1] <= N; j++)
{
if (prime[j + 1] - prime[j] == 2)
num++;
}
printf("%d",num);
return 0;
}
1008 数组元素循环右移问题 (20 分)
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
//1.只改变输出元素的顺序
//2.使用数组交换,交换的次数比较多
//3.使用链表reverse求解
int main()
{
return 0;
}
#include <stdio.h>
void reverse(int a[], int start, int end){
for(int i=start; i<=(start+end)/2; i++){
int tmp = a[i];
a[i] = a[start+end-i];
a[start+end-i] = tmp;
}
}
int main(){
int n, m;
scanf("%d %d", &n, &m);
m %= n;
int a[n];
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
}
reverse(a, 0, n-m-1);
reverse(a, n-m, n-1);
reverse(a, 0, n-1);
printf("%d", a[0]);
for(int i=1; i<n; i++){
printf(" %d", a[i]);
}
printf("\n");
return 0;
}
1009 说反话 (20 分)
基础题,二维字符串数组存放每一个单词
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//const int maxn =85;
//char a[maxn];
int main()
{
char word[80][80];
int wordnum;
char words[80];
wordnum = 0;
int num = 0;
while (scanf("%s", words) != EOF)
{
strcpy(word[wordnum++], words);
//printf("%s", word[num++]);
memset(words, '\0', sizeof(words));
}
for (wordnum = wordnum - 1; wordnum >= 0; wordnum--)
{
//printf("!!!");
printf("%s", word[wordnum]);
if (wordnum != 0)
printf(" ");
else printf("\n");
}
//memset(a,'\0',sizeof(a));
//scanf("%d", &N);
//scanf("%d %d", &L, &M);
//printf("%d %d\n", L, M);
//printf("%d\n", num);
return 0;
}
—08.12——————————————————————
1010 一元多项式求导 (25 分)
注意没有输出的时候是零多项式,要打印出0 0
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a, b;
int temp1, temp2;
int sum=0;
int flag = 0;
while (scanf("%d %d", &a, &b) != EOF)
{
temp1 = a * b;
temp2 = b - 1;
if (b != 0)
{
if (flag == 1)
printf(" ");
printf("%d %d", temp1, temp2);
flag = 1;
}
}
if (flag == 0)
printf("0 0");
}
1011 A+B 和 C (15 分)
基础题,用longlong存储
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
using namespace std;
int main()
{
long long int a, b, c;
int t, i;
scanf("%d", &t);
for (i = 1; i <=t; i++)
{
scanf("%lld %lld %lld",&a,&b,&c);
if (a + b > c)
printf("Case #%d: true\n",i);
else
printf("Case #%d: false\n", i);
}
return 0;
}
1012 数字分类 (20 分)
基础题,注意格式
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
const int maxn = 1010;
int a[maxn] = { 0 };
int main()
{
int N;
int i;
int A1, A2, A3, A5;
float A4;
int B[6];
int temp;
int num;
while (scanf("%d", &N) != EOF)
{
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
A1 = A2 = A3 = A4 = A5 = 0;
B[1] = B[2] = B[3] = B[4] = B[5] = 0;
temp = 1;
for (i = 0; i < N; i++)
{
num = a[i] % 5;
if (num == 0)
{
if (a[i] % 2 == 0)
{
B[1] = 1;
A1 += a[i];
}
}
else if (num == 1)
{
B[2] = 1;
A2 += temp * a[i];
temp = temp * (-1);
}
else if (num == 2)
{
B[3] = 1;
A3++;
}
else if (num == 3)
{
B[4]++;
A4 += a[i];
}
else
{
B[5] = 1;
if (a[i] > A5)
A5 = a[i];
}
}
for (i = 1; i <= 5; i++)
{
if (B[i] == 0)
{
if (i != 5)
printf("N ");
else
printf("N");
}
else if (i == 1)
printf("%d ", A1);
else if (i == 2)
printf("%d ", A2);
else if (i == 3)
printf("%d ", A3);
else if (i == 4)
printf("%.1f ", A4 / B[4]);
else
printf("%d\n", A5);
}
}
return 0;
}
1013 数素数 (20 分)
素数基础题
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1000001;
bool p[maxn] = { 0 };
int prime[maxn], pNum = 0;
void Find_Prime(int n)
{
for (int i = 2; i < maxn; i++)
{
if (p[i] == 0)
{
prime[pNum++] = i;
if (pNum >= n)
break;
for (int j = i + i; j < maxn; j += i)
{
p[j] = 1;
}
}
}
}
int main()
{
int m, n;
int i;
int count=0;
scanf("%d %d",&m,&n);
Find_Prime(n);
for (i = m; i <= n; i++)
{
printf("%d", prime[i-1]);
count++;
if (count % 10 != 0 && i < n)
printf(" ");
else
printf("\n");
}
return 0;
}
1014 福尔摩斯的约会 (20 分)
这题细节真多,判断星期只能是字符A-G,判断小时只能是A-N或者数字,判断完星期之后才能判断小时,注意判断条件,以及break怎么用
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int a[maxn] = { 0 };
int main()
{
char str1[62], str2[62], str3[62], str4[62];
scanf("%s %s %s %s", str1, str2, str3, str4);
int i, j;
int flag=0;
int day;
int HH, MM;
int len;
len = min(strlen(str1), strlen(str2));
for (i = 0; i < len; i++)
{
if (flag == 0)
{
if (str1[i] >= 'A' && str1[i] <= 'G'&& str1[i] == str2[i])
{
if (str1[i] >= 'A' && str1[i] <= 'G')
day = str1[i] - 'A' + 1;
flag++;
i++;
}
}
if (flag==1&&( str1[i] >= 'A' && str1[i] <= 'N'|| str1[i] >= '0' && str1[i] <= '9')&& str1[i] == str2[i])
{
if (str1[i] >= 'A' && str1[i] <= 'N')
HH = str1[i] - 'A' + 10;
else
HH= str1[i] - '0' + 0;
break;
}
}
len = min(strlen(str3), strlen(str4));
for (i = 0; i < len; i++)
{
if ((str3[i] >= 'a' && str3[i] <= 'z' || str3[i] >= 'A' && str3[i] <= 'Z') && str3[i] == str4[i])
{
MM = i;
break;
}
}
//这里直接用一个字符数组更方便
if (day == 1)
printf("MON");
else if (day == 2)
printf("TUE");
else if (day == 3)
printf("WED");
else if (day == 4)
printf("THU");
else if (day == 5)
printf("FRI");
else if (day == 6)
printf("SAT");
else if (day == 7)
printf("SUN");
printf(" ");
printf("%02d:%02d\n",HH,MM);
return 0;
}
1015 德才论 (25 分)
德胜才也包括德=才,www题目能不能说清楚一点啊!不然2,3,4测试点也不会一直过不了,还有这个cmp函数有点东西,好方便!
看到别人的题解还有一种方法是在结构体里面加上分级class,这样在sort分类的时候直接比较class就可以了
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct student {
int id;
int de;
int cai;
int sum;
int hh;//表示才德全高
int h;//表示才分不到线但是德分到线
int dc;//得分胜过才分
}stu[maxn];
bool cmp(student a, student b)
{
if (a.hh != b.hh) return a.hh > b.hh;//第三筛选标准
else if (a.hh == 1)
{
if (a.sum != b.sum) return a.sum > b.sum;
else if (a.de != b.de) return a.de > b.de;
else return a.id < b.id;
}
else if (a.h != b.h) return a.h > b.h;
else if (a.h == 1)
{
if (a.sum != b.sum) return a.sum > b.sum;
else if (a.de != b.de) return a.de > b.de;
else return a.id < b.id;
}
else if (a.dc != b.dc)return a.dc > b.dc;
else if (a.dc == 1)
{
if (a.sum != b.sum) return a.sum > b.sum;
else if (a.de != b.de) return a.de > b.de;
else return a.id < b.id;
}
else
{
if (a.sum != b.sum) return a.sum > b.sum;
else if (a.de != b.de) return a.de > b.de;
else return a.id < b.id;
}
}
int main()
{
int N, L, H;
int i;
int id, de, cai;
int num = 0;
scanf("%d %d %d", &N, &L, &H);
for (i = 0; i < N; i++)
{
scanf("%d %d %d", &id, &de, &cai);
if (de >= L && cai >= L)
{
stu[num].id = id;
stu[num].de = de;
stu[num].cai = cai;
stu[num].sum = de + cai;
stu[num].hh = 0;
stu[num].h = 0;
stu[num].dc = 0;
if (de >= H)
{
if (cai >= H)
stu[num].hh = 1;
else
stu[num].h = 1;
}
if (de >= cai)
{
stu[num].dc = 1;
}
num++;
}
}
//for (i = 0; i < num; i++)
//printf("%d %d %d %d %d %d\n", stu[i].id, stu[i].de, stu[i].cai, stu[i].hh, stu[i].h, stu[i].dc);
sort(stu, stu + num, cmp);
printf("%d\n", num);
for (i = 0; i < num; i++)
printf("%d %d %d\n", stu[i].id, stu[i].de, stu[i].cai);
}
1016 部分A+B (15 分)
基础题
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int main()
{
int a, da, b, db;
int pa,pb;
scanf("%d %d %d %d",&a,&da,&b,&db);
pa = pb = 0;
while (a != 0)
{
if (da == a % 10)
pa = pa * 10 + da;
a /= 10;
}
while (b != 0)
{
if (db == b % 10)
pb = pb * 10 + db;
b /= 10;
}
printf("%d\n",pa+pb);
}
1017 A除以B (20 分)
大整数相除
1018 锤子剪刀布 (20 分)
codeup原题
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
const int maxn = 1010;
int a[maxn] = { 0 };
int main()
{
int N;
char temp1, temp2;
int i;
int jia[6] = { 0 };
int yi[6] = {0};
int max1, max2;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
getchar();
scanf("%c %c", &temp1, &temp2);
if (temp1 == temp2)
{
jia[1]++;
yi[1]++;
}
if (((temp1 == 'C') && (temp2 == 'J')))
{
jia[0]++;
yi[2]++;
jia[4]++;
}
if (((temp1 == 'J') && (temp2 == 'B')))
{
jia[0]++;
yi[2]++;
jia[5]++;
}
if (((temp1 == 'B') && (temp2 == 'C')))
{
jia[0]++;
yi[2]++;
jia[3]++;
}
if (((temp2 == 'C') && (temp1 == 'J')))
{
jia[2]++;
yi[0]++;
yi[4]++;
}
if (((temp2 == 'J') && (temp1 == 'B')))
{
jia[2]++;
yi[0]++;
yi[5]++;
}
if (((temp2 == 'B') && (temp1 == 'C')))
{
jia[2]++;
yi[0]++;
yi[3]++;
}
}
max1 = max2 = 3;
for (i = 3; i <= 5; i++)
{
if (jia[i] > jia[max1])
max1 = i ;
if (yi[i] > yi[max2])
max2 = i;
}
printf("%d %d %d\n", jia[0], jia[1], jia[2]);
printf("%d %d %d\n", yi[0], yi[1], yi[2]);
if (max1 == 3)
printf("B ");
else if (max1 == 4)
printf("C ");
else printf("J ");
if (max2 == 3)
printf("B");
else if (max2 == 4)
printf("C");
else printf("J");
return 0;
}
1019 数字黑洞 (20 分)
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cmath>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int to_number(int a[])
{
int i;
int temp = 1;
int ans=0;
for (i = 3; i >=0; i--)
{
ans += a[i] * temp;
temp *= 10;
}
return ans;
}
void to_array(int a[],int temp)
{
int i;
for (i = 0; i <4; i++)
{
a[i] = temp % 10;
temp /= 10;
}
return;
}
int main()
{
int i;
int a[5];
int num;
int num1, num2;
int temp=0;//当前两个数的差值
scanf("%d", &num);//从输入获取数字
while (1)
{
to_array(a,num);//将数字存储到整数数组a内
sort(a, a + 4);//从小到大排列
num1 = to_number(a);//输出到num1中
sort(a, a + 4, cmp);//
num2 = to_number(a);
num = num2 - num1;//计算大数建去小数
printf("%04d - %04d = %04d\n", num2, num1,num);
if (num == 0||(num==6174))
break;
}
return 0;
}
1020 月饼 (25 分)
贪心
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct mooncake {
double store;//库存量
double sell;//总售价
double price;//单价
}cake[1010];//最多有1000种月饼
bool cmp(mooncake a, mooncake b)//将月饼结构体按照单价由高到低排序
{
return a.price > b.price;
}
int main()
{
double gain=0;//最大收益
int N, D;
int i;
scanf("%d %d", &N, &D);
for (i = 0; i < N; i++)//接收库存量
{
scanf("%lf", &cake[i].store);
}
for (i = 0; i < N; i++)//接受总售价
{
scanf("%lf", &cake[i].sell);
}
for (i = 0; i < N; i++)//计算单价
{
cake[i].price = cake[i].sell / cake[i].store;
}
sort(cake, cake + N, cmp);//排序
for (i = 0;i < N; i++)
{
if (D == 0)
break;
if (cake[i].store > D)
{
gain += cake[i].price * D;
break;
}
else
{
gain += cake[i].sell;
D -= cake[i].store;
}
}
printf("%.2lf",gain);//包留两位小数输出gain
return 0;
}
1021 个位数统计 (15 分)
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[10];//表示0-9的个数
int main()
{
int i;
for (i = 0; i < 10; i++)
num[i] = { 0 };
char a[1010];
int temp;
scanf("%s", &a);
for (i = 0; i < strlen(a); i++)
{
temp = a[i] - '0';
num[temp]++;
}
for (i = 0; i < 10; i++)
{
if (num[i] != 0)
{
printf("%d:%d\n",i,num[i]);
}
}
}
1022 D进制的A+B (20 分)
记得要用do while格式,不然当数字为0的时候有错误
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a, b, d;
int sum;
scanf("%d %d %d",&a,&b,&d);
sum = a + b;
int i;
int num=0;
int ans[10000];
do
{
ans[num++] = sum % d;
sum /= d;
} while (sum != 0);
for (i = num-1; i >=0; i--)
printf("%d",ans[i]);
}
1023 组个最小数 (20 分)
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int m;
int b[50];
int i, j;
int num = 0;
int temp=0;
for (int i = 0; i < 10; i++)
{
scanf("%d",&m);
for (j = 0; j < m; j++)
b[num++] = i;
}
sort(b, b + num);//排序
//排序完成后,找到将第一个不为零的数temp的下标,将前面的数依次向后挪一位,将b数组的第[0]位设置为temp
for (int i = 0; i < num; i++)
{
if (b[i] != 0)
{
temp = b[i];
for (j = i; j >= 1; j--)
b[j] = b[j - 1];
b[0] = temp;
break;
}
}
for (int i = 0; i < num; i++)
{
printf("%d",b[i]);
}
return 0;
}
1024 科学计数法 (20 分)
在这里插入代码片
1029 旧键盘 (20 分)
这题一开始想用set自动排序并去重,但是发现题目要按照输入的顺序输出,思路如下:
1、首先让字符串b内的字符hashtable都变为1
2、遍历字符串a内的字符,如果hash表内为0,则输出,让该字符的hash变为1,下一次遇到这个字符的时候不输出
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
int hashtable[37] = { 0 };
int main()
{
char a[100];
char b[100];
int i;
int temp;
int j;
scanf("%s", a);
scanf("%s", b);
//下面给a和b去重
for (i = 0; i < strlen(b); i++)
{
if (b[i] >= 'A' && b[i] <= 'Z')
temp = b[i] - 'A' + 10;
else if (b[i] >= 'a' && b[i] <= 'z')
temp = b[i] - 'a' + 10;
else if (b[i] >= '0' && b[i] <= '9')
temp = b[i] - '0';
else
temp = 36;
if (hashtable[temp] == 0)
hashtable[temp] = 1;
}
for (i = 0; i < strlen(a); i++)
{
if (a[i] >= 'A' && a[i] <= 'Z')
temp = a[i] - 'A' + 10;
else if (a[i] >= 'a' && a[i] <= 'z')
temp = a[i] - 'a' + 10;
else if (a[i] >= '0' && a[i] <= '9')
temp = a[i] - '0';
else
temp = 36;
if (hashtable[temp] == 0)
{
if (a[i] >= 'a' && a[i] <= 'z')
{
a[i] = a[i] - 32;
}
printf("%c",a[i]);
hashtable[temp] = 1;
}
}
return 0;
}
1028 人口普查 (20 分)
这题我都怀疑人生了,然后发现是num++的锅,还是亿点细节
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int judge(int day)//判断生日是否合法
{
if (day < 20140907 && day > 18140905)
return 1;
else
return 0;
}
struct vill {
char name[8];
int day;
}Vil[maxn];
bool cmp(vill a,vill b) //按照年长排序
{
return a.day < b.day;
}
int main()
{
int n;
int i, j;
char a[15];
char name[8];
int year, mouth, day;
int num = 0;//合法生日的个数
scanf("%d",&n);
for (i = 0; i < n; i++)
{
year = mouth = day = 0;
scanf("%s",name);
scanf("%s", a);
//printf("%s\n",a);
//下面把字符串变成年月日
for (j = 0; j < 10; j++)
{
if (j == 4||j==7)
j++;
if (j <= 3)
year = year * 10 + a[j]-'0';
else if (j <= 6)
mouth = mouth * 10 + a[j]-'0';
else if(j<10)
day = day * 10 + a[j]-'0';
}
day = year * 10000 + mouth * 100 + day;
if (judge(day))//如果合法
{
strcpy(Vil[num].name,name);
Vil[num].day = day;
num++;
}
}
if (num != 0)
{
sort(Vil, Vil + num, cmp);
printf("%d %s %s", num, Vil[0].name, Vil[num - 1].name);
}
else
printf("0");
return 0;
}
1031 查验身份证 (15 分)
这道题目没有让输出异常的身份证个数,如果要先输出个数的话,需要将异常的身份证先转存,然后统一输出。
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char yichang[100][18];
int main()
{
int n;
int i,j;
char id[20];
int temp;
char jiaoyan;
int sum=0;
int quanzhong[17]{ 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char a[11] = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
scanf("%d",&n);
int num = 0;
for (i = 0; i < n; i++)
{
sum = 0;
scanf("%s",id);
for (j = 0; j < 17; j++)
{
sum += (id[j] - '0') * quanzhong[j];
}
temp = id[17];
sum %= 11;
if (a[sum] != temp)
{
printf("%s\n",id);
num++;
}
}
if (num == 0)
printf("All passed\n");
return 0;
}
1027 打印沙漏 (20 分)
这题注意最后没有剩下字符的时候,要在最后一行输出0
另外使用math.h里面的函数比如向下取整floor()很好用
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
char c;
double sum;
scanf("%lf %c",&sum,&c);
int n;
n = floor(sqrt((sum + 1) / 2));
int i;
int j;
for (i = n; i >0; i--)
{
for (j = 0; j < n - i; j++)
printf(" ");
for (j = 0; j < 2 * i - 1; j++)
printf("%c", c);
printf("\n");
}
for (i = 1; i <= n - 1; i++)
{
for (j = 1; j <= n-i-1; j++)
printf(" ");
for (j = 0; j < 1 + 2 * i; j++)
printf("%c",c);
printf("\n");
}
int temp;
temp = sum + 1 - 2 * n * n;
printf("%d",temp);
return 0;
}
1026 程序运行时间 (15 分)
注意输出要%02d不然测试点234答案错误
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int C1, C2;
double miao;
int s;
scanf("%d %d",&C1,&C2);
miao = (C2 - C1) * 1.0 / 100;
if ((miao - (C2 - C1) / 100) >= 0.5)
s = miao + 1;
else
s = miao;
//下面求时分秒
int hh, mm;
hh = mm = 0;
while (s >= 60)
{
if (s >= 3600)
{
hh++;
s -= 3600;
}
else
{
mm++;
s -= 60;
}
}
printf("%02d:%02d:%02d",hh,mm,s);
return 0;
}
1033 旧键盘打字 (20 分)
这题让我深深体会到了string的好处,以后一定要用起来!
一开始用scanf("%s",a)输入字符串,会有两个测试点报错,使用geline(cin,a),就好了,速度也变快了
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<string>
#include<stdlib.h>
using namespace std;
const int maxn = 100010;
int hashtable[67] = { 0 };//一开始所有的键都可以打出来
int main()
{
string a, b;
getline(cin, a);
getline(cin, b);
int i, j;
for (i = 0; i < a.length(); i++)
{
if (a[i] >= '0' && a[i] <= '9')
hashtable[a[i] - '0'] = 1;
else if (a[i] >= 'A' && a[i] <= 'Z')
{
hashtable[a[i] - 'A' + 36] = 1;
hashtable[a[i] - 'A' + 10] = 1;
}
else if (a[i] == '_')
hashtable[62] = 1;
else
{
if (a[i] == ',')
hashtable[63] = 1;
else if (a[i] == '.')
hashtable[64] = 1;
else if (a[i] == '-')
hashtable[65] = 1;
else
{
for (j = 36; j <= 61; j++)
hashtable[j] = 1;
hashtable[66] = 1;
}
}
}
int temp;
int flag = 0;
for (i = 0; i < b.length(); i++)
{
if (b[i] >= '0' && b[i] <= '9')
temp = b[i] - '0';
else if (b[i] >= 'a' && b[i] <= 'z')
temp = b[i] - 'a' + 10;
else if (b[i] >= 'A' && b[i] <= 'Z')
temp = b[i] - 'A' + 36;
else if (b[i] == '_')
temp = 62;
else if (b[i] == ',')
temp = 63;
else if (b[i] == '.')
temp = 64;
else if (b[i] == '-')
temp = 65;
else
temp = 66;
if (hashtable[temp] == 0)
{
printf("%c", b[i]);
flag = 1;
}
else
;
}
if (flag == 0)
printf("\n");
return 0;
}
1、我写的代码还是太冗长了,看到别人的题解,让hashtable开的大一点,比ascll字符的总数还大,比如hashtable[300],之后直接让hashtable[a[i]]=1,就可以了。
2、还有一开始我用hashtable[67]={1},以为所有元素都成1,其实是错误的,这样只有第一个元素是1。为了初始化的方便以后还是把所有元素都设置为0.
3、用stl解题,看着dl的题解留下菜鸡的眼泪
#include <iostream>
#include <cctype>
#include<string>
using namespace std;
int main() {
string bad, should;
getline(cin, bad);
getline(cin, should);
for (int i = 0, length = should.length(); i < length; i++) {
if (bad.find(toupper(should[i])) != string::npos) continue;//转换成大写字母,如果在bad里面找到了,就不输出
if (isupper(should[i]) && bad.find('+') != string::npos) continue;//如果是大写字母并且bad里面有+,也不输出
cout << should[i];
}
return 0;
}