YH
//32
#include <stdio.h>
#include <stdbool.h>
bool people[20000];
int main()
{
memset(people, 1, sizeof(people));
int n, m;
scanf("%d %d", &n, &m);
printf("请输入n、m:");
int i = 1, times = 1, t = n;
while(t>1)
{
if (i == 0) i = n;
if (!people[i])
{
i = (i + 1) % n;
}
else if (people[i]&×!=m)
{
times++;
i = (i + 1) % n;
}
else if (people[i]&×==m)
{
times=1;
people[i] = 0;
i = (i + 1) % n;
t--;
}
}
for (int j = 1;; j++)
{
if (people[j])
{
printf("%d", j);
break;
}
}
return 0;
}
//34
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool ss(int n)
{
if (n == 1) return 0;
if (n == 2) return 1;
for (int i = 2; i <= sqrt(n); i++)
if (n % i == 0) return 0;
return 1;
}
int arr[1001] = { 0 };
int main()
{
int m, n, cnt = 0, count = 0;
scanf("%d %d", &m, &n);
if (m > n)
{
int temp = m;
m = n;
n = temp;
}
for (int i = m; i <= n; i++)
{
if (ss(i)) arr[++cnt] = i;
}
for (int j = 1; j <= cnt - 1; j++)
{
if (arr[j + 1] - arr[j] == 2)
{
count++;
printf("(%d,%d)\n", arr[j], arr[j + 1]);
}
}
if (count == 0) printf("没有找到");
else printf("共找到%d对孪生素数", count);
return 0;
}
//42
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool wqs(int n)
{
int sum = 0;
for (int i = 1; i <= sqrt(n); i++)
{
if (n % i == 0)
{
sum += i;
sum += n / i;
if (i * i == n) sum -= i;
}
}
sum -= n;
if (sum == n) return 1;
return 0;
}
int main()
{
int n, cnt = 0;
scanf("%d", &n);
for (int i = n; i >= 2; i--)
{
if (wqs(i)) cnt++;
}
printf("%d", cnt);
return 0;
}
JX
//36
#include <stdio.h>
int main()
{
int m, n;
scanf("%d\n%d", &m, &n);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("(%d,%d)", i, j);
if (j != n) printf(" ");
}
if (i != m) printf("\n");
}
return 0;
}
//37
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool ss(int n)
{
if (n == 1) return 0;
if (n == 2) return 1;
for (int i = 2; i <= sqrt(n); i++)
if (n % i == 0) return 0;
return 1;
}
int main()
{
int x, k;
scanf("%d %d", &x, &k);
int cnt = 0;
while (k)
{
if (ss(x))
{
printf("%d ", x);
k--;
cnt++;
if (k)
{
if (cnt % 5 == 0) printf("\n");
}
}
x++;
}
return 0;
}
//38
#include <stdio.h>
int digit_product(int a)
{
int ans=1;
while (a)
{
ans *= a % 10;
a /= 10;
}
return ans;
}
int continuous(int a)
{
int current = 0;
while (a >= 10)
{
current++;
a = digit_product(a);
}
return current;
}
int main()
{
int a, b,arr[1000];
scanf("%d %d", &a, &b);
int result = 0;
//arr[0]放的是a的
for (int i = a; i <= b; i++)
{
arr[i-a] = continuous(i);
if (arr[i-a] > result) result = arr[i-a];
}
printf("%d\n", result);
int flag = 0;
for (int i = a; i <= b; i++)
{
if (arr[i-a] == result)
{
if (flag) printf(" ");
printf("%d", i);
flag = 1;
}
}
return 0;
}
//39
#include <stdio.h>
typedef struct
{
int index;
char name[9];
}Stu;
int main()
{
Stu boy[25],girl[25];
int n,t,ib=0,ig=0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &t);
if (t) { scanf("%s", boy[ib].name); boy[ib++].index = i; }
else { scanf("%s", girl[ig].name); girl[ig++].index = i; }
}
for (int i = 0; i < n/2; i++)
{
if (boy[i].index < girl[i].index) printf("%s %s\n", boy[i].name, girl[i].name);
else printf("%s %s\n", girl[i].name, boy[i].name);
}
return 0;
}
//40
#include <stdio.h>
int arr[1001]={0}, grade[1001] = {0}, flag[1001] = {0};
char c[1001] = { '\0' };
int main()
{
int i=0,cnt=0;
while (scanf("%d", &flag[i])!=EOF)
{
cnt++;
if (flag[i])
scanf("%d,%c", &arr[i], &c[i]);
else scanf("%d,%d", &arr[i], &grade[i]);
i++;
}
for (int j = 0; j < cnt; j++)
{
if (flag[j])
printf(" %d %c\n", arr[j], c[j]);
else printf(" %d %d\n", arr[j], grade[j]);
}
return 0;
}
神秘15T
//46
#include <stdio.h>
void hanoi(int n, char a, char b, char c)
{
if (n == 1)
printf("1 %c->%c\n", a, c);
else
{
hanoi(n - 1, a, c, b);
printf("%d %c->%c\n",n, a, c);
hanoi(n - 1, b, a, c);
}
}
int main()
{
int n,flag=0;
while (scanf("%d", &n) == 1)
{
if (flag) printf("\n");
hanoi(n, 'A', 'B', 'C');
flag = 1;
}
return 0;
}
//47
#include <stdio.h>
int dp[105][105];
//动态规划,用二维数组dp存储中间结果
//当dp[n][m](原本的返回值)已经计算过时,直接返回
int f(int n, int m)
{
if (n < m) return f(n, n);
//如果最大加数比n大,那就不能加这么大,这是关键
if (n == 0) return 1;
if (m == 0) return 0;
if (dp[n][m] != 0) return dp[n][m];
dp[n][m]= f(n - m, m) + f(n, m - 1);
return dp[n][m];
//如果算式中最大数有m,那就是n-m个数的情况;如果没有最大加数m-1接着推
}
int main()
{
int n, m, ans;
scanf("%d %d", &n, &m);
ans = f(n, m);
printf("%d", ans);
return 0;
}
//48
#include <stdio.h>
int f(int n)
{
if (n == 1 || n == 2) return 1;
return f(n - 1) + f(n - 2);
}
int main()
{
int n,flag=0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
printf("%-10d", f(i));
flag++;
if (flag % 4 == 0) printf("\n");
}
return 0;
}
//49
#include <stdio.h>
#include <math.h>
//已知温度 露点求湿度H
double caculate_humidex(double temp, double dew)
{
double e = 6.11 * exp(5417.7530 * ((1 / 273.16) - (1 / (273.16 + dew))));
double h = 0.5555 * (e - 10);
return temp + h;
}
//已知露点 湿度 求温度T
double caculate_temp(double dew, double humidex)
{
double e = 6.11 * exp(5417.7530 * ((1 / 273.16) - (1 / (273.16 + dew))));
double h = 0.5555 * (e - 10);
return humidex - h;
}
//已知温度 湿度 求露点D
double caculate_dew(double temp, double humidex)
{
double ans = 0;
for (double delta=100; delta>1e-4; delta*=0.5)
{
if (caculate_humidex(temp, ans) > humidex)
ans -= delta;
else ans += delta;
}
return ans;
}
int main()
{
char c1, c2;
double a1, a2, a3;
int cnt = 0;
while (1)
{
scanf("%c", &c1);
if (c1 == 'E') break;
scanf("%lf %c %lf", &a1,&c2, &a2);
if (c1 == 'T' && c2 == 'D')
{
a3 = caculate_humidex(a1, a2);
printf("T %.1lf D %.1lf H %.1lf\n",a1,a2,a3);
}
else if (c1 == 'T' && c2 == 'H')
{
a3 = caculate_dew(a1, a2);
printf("T %.1lf D %.1lf H %.1lf\n", a1, a3, a2);
}
else if (c1 == 'D' && c2 == 'T')
{
a3 = caculate_humidex(a2, a1);
printf("T %.1lf D %.1lf H %.1lf\n", a2, a1, a3);
}
else if (c1 == 'H' && c2 == 'T')
{
a3 = caculate_dew(a2, a1);
printf("T %.1lf D %.1lf H %.1lf\n", a2, a3, a1);
}
else if (c1 == 'D' && c2 == 'H')
{
a3 = caculate_temp(a1, a2);
printf("T %.1lf D %.1lf H %.1lf\n", a3, a1, a2);
}
else if (c1 == 'H' && c2 == 'D')
{
a3 = caculate_temp(a2, a1);
printf("T %.1lf D %.1lf H %.1lf\n", a3, a2, a1);
}
}
return 0;
}
//50
#include <stdio.h>
int main()
{
printf("x=11,y=32,z=13\nx=21,y=22,z=13\nx=11,y=12,z=13");
return 0;
}
//51
#include <stdio.h>
int main()
{
int a[101] = { 0 };
char str[101],*p;
fgets(str, sizeof(str), stdin);
int i = 0;
//利用指针遍历字符串
for (p = str; *p; p++)
{
if (*p >= '0' && *p <= '9')
{
int num = 0;
while (*p >= '0' && *p <= '9')
{
num = num * 10 + (*p - '0');
p++;
}
a[i++] = num;
}
}
printf("%d\n", i);
for(int j=0;j<i;j++)
{
printf("%d", a[j]);
if (j != i - 1) printf(" ");
}
return 0;
}
//52
#include <stdio.h>
int main()
{
int max = -1, temp,cnt=0;
do {
scanf("%d", &temp);
if (temp < 0 && cnt == 0)
{
printf("NULL!");
return 0;
}
if (temp > max) max = temp;
cnt++;
} while (temp >= 0);
printf("max=%d", max);
return 0;
}
//53
#include <stdio.h>
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
return ;
}
int main()
{
int a[3];
scanf("%d %d %d", &a[0], &a[1], &a[2]);
for (int i = 0; i <3-1; i++)
{
for (int j = 0; j < 3 - i - 1; j++)
if (a[j] < a[j + 1]) swap(&a[j], &a[j + 1]);
}
printf("%d,%d,%d", a[0], a[1], a[2]);
return 0;
}
//54
#include <stdio.h>
#include <string.h>
void StringSort(char *stringpoint[],int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(strcmp(stringpoint[j],stringpoint[j+1])>0)
{
char *temp=stringpoint[j];
stringpoint[j]=stringpoint[j+1];
stringpoint[j+1]=temp;
}
}
}
}
int main()
{
char strings[3][1001];
char *stringpoint[3];
for(int i=0;i<3;i++)
{
scanf("%s",strings[i]);
stringpoint[i]=strings[i];
}
StringSort(stringpoint,3);
for(int i=0;i<3;i++)
{
printf("%s",stringpoint[i]);
if(i!=2) printf("\n");
}
return 0;
}
//55
#include <stdio.h>
void swap10(int arr[])
{
int i = 0, j = 9;
for (; i <= 4; i++, j--)
{
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
return ;
}
int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
scanf("%d", &arr[i]);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
swap10(arr);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//56
#include <stdio.h>
int main()
{
int n;
const char mon[12][16] = { "January","February","March","April",
"May","June","July","August",
"September","October","November","December" };
do {
scanf("%d", &n);
if (n > 0) printf("%s\n", mon[n - 1]);
} while (n != -1);
return 0;
}
//57
#include <stdio.h>
void my_swap(int arr[], int a, int b)
{
if (b == 0) return;
int right = a + b - 1;
if (a + b - 1 > 10) right = 10;
while (1)
{
int temp = arr[a];
arr[a] = arr[right];
arr[right] = temp;
a++;
right--;
if (a >= right) break;
}
return;
}
int main()
{
int arr[11];
arr[0] = 0;
for (int i = 1; i <= 10; i++)
scanf("%d", &arr[i]);
int a, b;
scanf("%d %d", &a, &b);
my_swap(arr, a, b);
for (int i = 1; i <= 10; i++)
printf("%d ", arr[i]);
return 0;
}
//58
#include <stdio.h>
int main()
{
char str[] = "software";
char* p = str;
for (; *p != '\0'; p += 2)
printf("%c", *p);
return 0;
}
//59
#include <stdio.h>
int row, column,max=-1;
void insert(int a[][5])
{
for (int i = 0; i < 3; i++)
for (int j = 0; j < 5; j++)
scanf("%d", &a[i][j]);
return;
}
void find(int a[][5])
{
for (int i = 0; i < 3; i++)
for (int j = 0; j < 5; j++)
if (a[i][j] > max)
{
max = a[i][j];
row = i;
column = j;
}
return;
}
void print()
{
printf("最高分是:%d\n行数是:%d\n列数是:%d", max, row, column);
return;
}
int main()
{
int gpa[3][5];
insert(gpa);
find(gpa);
print(gpa);
return 0;
}
//60
#include <stdio.h>
void Swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
return;
}
int main()
{
int x, y;
scanf("%d %d", &x, &y);
Swap(&x, &y);
printf("%d %d", x, y);
return 0;
}
数学相关
1.裴蜀定理
简单地说,对于互质的两个数a、b,其不能组成的最大数为 a*b-a-b
即大于这个数的数一定都能表示为a*x+b*y的形式(x,y∈R)
2.级数
(待研究!)
题源:蓝桥杯·算法双周赛第22场小白入门赛
dalao的题解思路:
正难则反
1.别人都加等于自己减少
题源:蓝桥杯·算法双周赛第22场小白入门赛
错误代码主函数部分(大模拟,TLE)
int main()//TLE Code
{
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
int cnt=0;
bool flag=true;
while(flag)
{
for(int i=n-1;i>=1;i--)
{
int gap=a[i]-a[0];
for(int j=0;j<n;j++) a[j]+=gap;
a[i]-=gap;
cnt+=gap;
if(a[i]==a[i-1])
{
flag=false;
break;
}
}
}
cout<<cnt;
return 0;
}
千万别像我最开始这样大模拟+小优化(划掉
正解:
为除自己以外的所有小伙伴带回一个能量晶石 == 自己扔一个能量晶石
那么扫一遍拿到最小值,再扫一遍,res+=a[i]-minv即可,时间复杂度O(n)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=100010;
int n;
int a[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int minv=2e9;
//扫一遍拿到最小值
for(int i=0;i<n;i++) minv=min(minv,a[i]);
long long res=0;
for(int i=0;i<n;i++) res+=a[i]-minv;
cout<<res;
return 0;
}