目录
4.A+B的平均值
注意直接算a+b如果a和b数值很大,a+b结果会溢出
正确做法:1.若a和b同号,average=(a-b)/2+b;
2.若a与b异号,直接(a+b)/2;
5.进制转换
把一个转换成8进制和16进制输出
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("%X,%o",a,a);
return 0;
}
通过这个题复习一下各个进制数字的表示
2进制:0b开头,如0b10101
8进制:0开头,如0756
16进制:X或x开头,如x789ff,X45FF
6.浮点数输出
本题实际考察格式化输出
#include<stdio.h>
int main()
{
double a=0.0;
scanf("%lf",&a);
printf("%.6lf,%.2lf,%.8lf",a,a,a);
return 0;
}
对应课本p73
11.倍数和
#include <stdio.h>
int main(){
unsigned int T = 0;
unsigned int arrn[100000];
scanf("%d", &T);
for(unsigned int i = 0; i < T; i++){
scanf("%u", &arrn[i]);
}
for(unsigned int j = 0; j < T; j++){
unsigned int res = 0;
for(unsigned int x = 1; x < arrn[j]; x++){
if(x % 3 == 0 || x % 5 == 0){
res += x;
}
}
printf("%ld\n", res);
}
return 0;
}
12.操作数
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int t=0;
while(n>0)
{
int m=n;
//求一次n的各位数之和
int sum=0;
for(int i=0;i>=0;i++)
{
sum+=m%10;
m=m/10;
if(m==0)
break;
}
n-=sum;
t++;
}
printf("%d",t);
return 0;
}
13.比率
#include<stdio.h>
#include<math.h>
//定义一个求最大公约数的函数
int gcd(int m,int n)
{
while(n)
{
int r=m%n;
m=n;
n=r;
if(r==0)
return m;
}
}
int main()
{
double a,b;
scanf("%lf",&a);
b=a;
//求a小数点后有几位 ,i表示位数
int i=0;
while(a-(int)a)
{
a*=10;
i++;
}
int u=(int)a;
int y=(int)pow(10,i);
printf("%d %d\n",u,y);
int c=gcd(u,y);
printf("%d/%d",u/c,y/c);
return 0;
}
注意点:
1.辗转相除法求最大公约数
2.强制类型转换,浮点型转换成整形会截断(直接抛弃小数)
15.乘数模
41.航空旅行(行李问题)
#include<stdio.h>
int main()
{
int n,a,b,c,d,e;
scanf("%d",&n);
int arr[n];
for(int i=0;i<n;i++)//输入
{
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
if( (a+b<=d&&c<=e) || (a+c<=d&&b<=e) || (b+c<=d&&a<=e) )
arr[i]=1;
else
arr[i]=0;
}
for(int j=0;j<n;j++)
{
if(arr[j])
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
1.每次输入完之后接着进行判断
2.利用数组存储每一次输入的判断结果
42.素数筛选法
#include<stdio.h>
#define N 100000000
char vis[N+1];//0表示i是素数,1表示合数
int pr[N];
int count=0;
int Euler(int n)
{
int i,j;
int ans=n-1;
for(i=2;i<=n;i++)
{
if(vis[i]==0)
pr[count++]=i;//建立一个存素数的数组
for(int j=0;j<count;j++)
{
//进行标记
if(i*pr[j]>n) break;
vis[i*pr[j]]=1;
ans--;
if(i%pr[j]==0) break; //就是这个语句,使得每个数只被遍历一次。
}
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
int ans=Euler(n);
printf("%d",ans);
return 0;
}
1.看懂埃氏筛,埃氏筛在遍历是,有多个素因子的数如12,18等会多次遍历,如果数字足够大,那么遍历的次数会大大增加。
2.欧拉筛的优点在于每一个数都只遍历一次,大大缩短了时间。
那么为什么欧拉筛的算法能遍历所有的数呢?
因为每一个合数都能分解出素因子,因此都能被遍历到。
为什么每个数都只被遍历一次呢?
打个表具体看一下
i= 2//当i取2时
j =1 b[1] = 2 i*b[j] = 4
i =3//当i取3时
j=1 b[1] = 2 i*b[j] =6
j=2 b[2] = 3 i*b[j] = 9
i=4//当i取4时
j=1 b[1] = 2 i*b[j] = 8//上面提到为什么退出循环,因为如果不退出循环,就会标记一次12,所以不行
i=5//当i取5时
j=1 b[1] = 2 i*b[j] = 10
j=2 b[2] = 3 i*b[j ]=15
j=3 b[3] = 5 i*b[j] = 25
i=6//当i取6时
j=1 b[1] = 2 i*b[j] =12//这里已经标记了12了。
i=7//当i取7时
j=1 b[1] = 2 i*b[j] = 14
j=2 b[1] = 3 i*b[j] = 21
j=3 b[1] = 5 i*b[j] = 35
j=4 b[1] = 7 i*b[j] = 49
每一个素数在相乘的时候,都没有乘一个大于自己的素数,这样的话,能够使12这样的数只被遍历到6时,被6*2标记一次,而不会被3*4标记,也不会被4*3标记。即总是被最小的素因子标记。
挺难理解的,想出这个方法的人真的牛。
43.稀疏矩阵
#include<stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int sum=n*m;//记录非零个数
int arr[n][m];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&arr[i][j]);
if(arr[i][j]==0)
sum--;
}
}
double all=(double)(m*n);
if( sum/all<=0.05 || (sum==m) || (sum==n))
printf("Yes");
else
printf("No");
return 0;
}
没啥好说的,重点可能就时二维数组的应用。
44.房价预测(线性回归)
#include<stdio.h>
int main()
{
//输入
int n;
double sum_x=0.0,sum_y=0.0;
int sqr_x;
int xy=0;
int y[100],x[100];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
sum_x+=x[i];
sum_y+=y[i];
xy+=x[i]*y[i];
sqr_x+=x[i]*x[i];
}
//计算平均值
double avg_x=sum_x/n;
double avg_y=sum_y/n;
//带入公式计算最终结果
double b=(xy-n*avg_x*avg_y)/(sqr_x-n*avg_x*avg_x);
double a=avg_y-b*avg_x;
if(b>0)
printf("Y=%.4lf+%.4lf*X",a,b);
else
printf("Y=%.4lf%.4lf*X",a,b);
return 0;
}
简单题。
45.蒙特卡罗方法求积分
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double fun1(double x);
double fun2(double x);
double fun3(double x);
double fun4(double x);
double fun5(double x);
int main()
{
srand(RAND_MAX);
double (*fun[6])(double)={0,fun1,fun2,fun3,fun4,fun5};//函数指针数组
int m,n;
double a,b,sum;
scanf("%d %lf %lf %d",&m,&a,&b,&n);
for(int i=1;i<=n;i++)
{
double r= ((double)rand() / RAND_MAX) * (b-a)+ a;;//把生成的随机数转化成a,b之间的数
double y=fun[m](r);
sum+=y*(b-a);
}
printf("%.6lf",sum/n);
return 0;
}
double fun1(double x)
{
double a=exp(-x);
return x*x*x*x*a;
}
double fun2(double x)
{
return x*x+1;
}
double fun3(double x)
{
return cos(x);
}
double fun4(double x)
{
return sqrt(x)*(x-2);
}
double fun5(double x)
{
return 2*sin(x)-5*cos(x);
}
47.回文数之和
#include<stdio.h>
int Palindromic_num_10(int n);//判断是不是 10进制回文数
int Palindromic_num_k(int n,int k); //判断是不是k进制回文数
int main()
{
int n,k;
int sum=0;
scanf("%d %d",&n,&k);
for(int i=1;i<n;i++)
{
if(Palindromic_num_10(i)&&Palindromic_num_k(i,k))
sum+=i;
}
printf("%d",sum);
return 0;
}
int Palindromic_num_10(int n)
{
//取n的每一位
int arr[100];
int i;
for( i=0;n>0;i++)
{
arr[i]=n%10;
n/=10;
}
int left=0;
int right=i-1;
while(left<right)
{
if(arr[left]==arr[right])
{
left++;
right--;
}
else
return 0;
}
return 1;
}
int Palindromic_num_k(int n,int k)
{
//取n转化成k进制的数的每一位,用取余的方法
int arr[100];
int i;
for( i=0;n>0;i++)
{
arr[i]=n%k;//注意,这里先取到的是高位
n/=k;
}
int left=0;
int right=i-1;
while(left<right)
{
if(arr[left]==arr[right])
{
left++;
right--;
}
else
return 0;
}
return 1;
}
学会用取余的方法把一个数转化成其他进制的数。
48.货运优化
#include<stdio.h>
int main()
{
int ans[1000];
int n=0;
while(1)
{
int sum=0;
int arr[7]={0};
for(int i=1;i<=6;i++)
{
scanf("%d",&arr[i]);
sum+=arr[i];
}
if(sum==0)
break;//如果全为0就退出循环
ans[n]=arr[4]+arr[5]+arr[6]+(arr[3]+3)/4;//+3是起到向上取整的效果
//4 5 6必定会占一个箱子,4个3占一个箱子,多余的必定也占一个箱子
//对4 和 3 补2
int consume[4]={0,5,3,1};
int total_con2=arr[4]*5+consume[arr[3]%4];//代表消耗2的量
int esp=arr[4]*20+arr[5]*11+36-9*(arr[3]%4);//esp代表3,4,5装完之后空出的空间
if(arr[2]>total_con2)
{
arr[2]-=total_con2;
ans[n]+=(arr[2]+8)/9;
esp-=total_con2*4+36-(arr[2]%9)*4;
}
else
{
esp-=arr[2]*4;
arr[2]=0;
}
//剩余的空间补1
if(arr[1]>esp)
ans[n]+=(arr[1]-esp)/36;
n++;
}
for(int j=0;j<n;j++)
{
printf("%d\n",ans[j]);
}
return 0;
}
49.完美矩阵
#include<stdio.h>
#include<math.h>
int arr[301][301];
int getsum(int i,int j,int k)
{
int sum=0;
for(int b=i+1;b<i+k;b++)
{
for(int a=j+1;a<j+k;a++)
{
sum+=arr[b][a];
}
}
return sum;
}
int main()
{
int n,m;
int ans=0;//记录结果
scanf("%d %d",&n,&m);
//输入
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&arr[i][j]);
if(arr[i][j]==0)
arr[i][j]=-1;
}
}
//
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k+i<=n&&k+j<=m;k++)//设置一个基点,从这个点向右向下拓展,即可做到不重不漏
{
if(arr[i][j]==-1||arr[i+k][j]==-1||arr[i][j+k]==-1)//只要上边和左边有一个
break; //数是0,那么就直接换下一个基点
else
{
for(int p=j+1;p<=j+k;p++)
{
if(arr[i+k][p]==-1)
goto break_;
}
for(int q=i+1;q<=i+k;q++)
{
if(arr[q][j+k]==-1)
goto break_;
}
if(k>2)
{
if(abs(getsum(i,j,k))>1)
continue;
}
ans++;
break_:;
}
}
}
}
printf("%d",ans);
return 0;
}
这题主要考验思维,能不能想到从一个基点开始遍历。并且要想到减小运算的方法。
50.前后缀移除
#include<stdio.h>
#include<string.h>
void str_lstrip(char* str,char* dele)
{
int move=0;
for(int i=0;i<strlen(str);i++)
{
if(strchr(dele,str[i]))//在dele中搜索有没有str[i],有返回地址,没有返回null
{
move++;
}
else
break;
}
memmove(str,str+move,strlen(str)-move+1);
}
void str_rstrip(char* str,char* dele)
{
int move=0;
for(int i=strlen(str)-1;i>=0;i--)
{
if(strchr(dele,str[i]))
{
move++;
}
else
break;
}
char* p=str+strlen(str);//指向字符串的\0
memmove(p-move,p,1);
}
int main()
{
char str[1000]="";
char dele[1000]="";
char str2[1000]="";
scanf("%[^\n]",str);
getchar();
scanf("%[^\n]",dele);
strcpy(str2,str);
str_lstrip(str,dele);
printf("%s\n",str);
str_rstrip(str2,dele);
printf("%s\n",str2);
str_rstrip(str,dele);
printf("%s",str);
return 0;
}
52.删除前后缀
#include<stdio.h>
#include<string.h>
void remove_prefix(char* str,char* dele)
{
char* p=str;
int move=0;
while(*p==dele[0])
{
for(int i=1;i<strlen(dele);i++)
{
if(p[i]!=dele[i])
goto a;
}
p+=strlen(dele);
move+=strlen(dele);
}
a:
memmove(str,str+move,strlen(str)-move+1);
}
void remove_suffix(char* str,char* dele)
{
char* p=str+strlen(str);//指示\0
char* dest=str+strlen(str)-1;//指示最后一个
int destination=strlen(str);
while(*dest==dele[strlen(dele)-1])
{
dest--;
for(int i=strlen(dele)-2;i>=0;i--,dest--)
{
if( (*dest) !=dele[i])
goto a;
}
destination-=strlen(dele);
}
a:
str[destination]='\0';
}
int main()
{
char str[1000]="";
char dele[1000]="";
char str2[1000]="";
scanf("%[^\n]",str);
getchar();
scanf("%[^\n]",dele);
strcpy(str2,str);
remove_prefix(str,dele);
printf("%s\n",str);
remove_suffix(str2,dele);
printf("%s",str2);
return 0;
}
54.KIDS A+B
#include<stdio.h>
#include<string.h>
int strtoint(const char*numbers[],char A[])
{
for(int i=0;i<=99;i++)
{
if(strcmp(A,numbers[i])==0)
return i;
}
}
int main()
{
const char* numbers[100] = {
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen",
"twenty", "twenty-one", "twenty-two", "twenty-three", "twenty-four", "twenty-five", "twenty-six", "twenty-seven", "twenty-eight", "twenty-nine",
"thirty", "thirty-one", "thirty-two", "thirty-three", "thirty-four", "thirty-five", "thirty-six", "thirty-seven", "thirty-eight", "thirty-nine",
"forty", "forty-one", "forty-two", "forty-three", "forty-four", "forty-five", "forty-six", "forty-seven", "forty-eight", "forty-nine",
"fifty", "fifty-one", "fifty-two", "fifty-three", "fifty-four", "fifty-five", "fifty-six", "fifty-seven", "fifty-eight", "fifty-nine",
"sixty", "sixty-one", "sixty-two", "sixty-three", "sixty-four", "sixty-five", "sixty-six", "sixty-seven", "sixty-eight", "sixty-nine",
"seventy", "seventy-one", "seventy-two", "seventy-three", "seventy-four", "seventy-five", "seventy-six", "seventy-seven", "seventy-eight", "seventy-nine",
"eighty", "eighty-one", "eighty-two", "eighty-three", "eighty-four", "eighty-five", "eighty-six", "eighty-seven", "eighty-eight", "eighty-nine",
"ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six","ninety-seven","ninety-eight","ninety-nine"
};
char A[20];
char B[20];
scanf("%s",A);
getchar();
scanf("%s",B);
int a=strtoint(numbers,A);
int b=strtoint(numbers,B);
printf("%s",numbers[a+b]);
return 0;
}
53.分离字符串
#include<stdio.h>
#include<string.h>
int str_split(char ans[][100],char str[],char sep[])
{
int len=strlen(sep);
int start=0,end=0;
int a=0;//记录有几个断点
for(int i=0;i<strlen(str);i++)
{
int flag=0;//判断是不是断点的标志
if(str[i]==sep[0])
{
for(int j=1;j<len;j++)
{
if(str[i+j]!=sep[j])
break;
flag++;
}
if(flag==len-1)//找到断点
{
end=i-1;
int p=0;
for( int k=start;k<=end;k++)
{
ans[a][p]=str[k];
p++;
}
if(i!=0)//防止上来就是断点而打印一个换行
{
for(int o=0;o<p;o++)
printf("%c",ans[a][o]);
printf("\n");
}
start=i+len;
a++;
}
}
if((i==strlen(str)-1)&& start<strlen(str))//使最后一个断点之后的能得到打印,并且避免断点出现在最后的时候重复打印
{
int p=0;
for(int k=start;k<=i;k++)
{
ans[a][p]=str[k];
p++;
}
for(int o=0;o<p;o++)
printf("%c",ans[a][o]);
}
}
return a+1;
}
int main()
{
char str[1000];
char sep[200];
char ans[20][100];
scanf("%[^\n]",str);
getchar();
scanf("%[^\n]",sep);
str_split(ans,str,sep);
return 0;
}
57.字符串后缀
#include<stdio.h>
#include<string.h>
int str_endswith(char str[],char suffix[]);
int main()
{
char str[1000];
char suffix[1000];
scanf("%[^\n]",str);
getchar();
scanf("%[^\n]",suffix);
if(str_endswith(str,suffix))
printf("Yes");
else
printf("No");
return 0;
}
int str_endswith(char str[],char suffix[])
{
for(int i=0;i<strlen(str);i++)
{
if(str[i]==suffix[0])
{
int flag=0;
for(int j=1;j<strlen(suffix);j++)
{
if( str[i+j]!=suffix[j])
break;
flag++;
}
if(flag==strlen(suffix)-1 && strlen(str)-strlen(suffix)==i)
return 1;
}
}
return 0;
}
58.Atol转换
#include <stdio.h>
#include <limits.h>
int atol(char *str) {
char *pStr = str;
int sgn = 1;
long long tmp = 0;
if (*pStr == '+') ++pStr;
else if (*pStr == '-') sgn = -1, ++pStr;
while (*pStr) {
if (*pStr == ' ') ;
else if ('0' <= *pStr && *pStr <= '9') {
tmp = (*pStr - '0') + tmp * 10;
if ((tmp * sgn) >= INT_MAX) return INT_MAX;
else if ((tmp * sgn) <= INT_MIN) return INT_MIN;
}
else break;
++pStr;
}
return tmp * sgn;
}
int main() {
char str[1000] = "";
scanf("%[^\n]", str);
printf("%d", atol(str));
return 0;
}
59.大小写交换
#include<stdio.h>
#include<string.h>
void str_swapcase(char arr[])
{
for(int i=0;i<strlen(arr);i++)
{
if(arr[i]<=90 && arr[i]>=65)//大写字母
arr[i]=arr[i]+32;
else if(arr[i]>=97 && arr[i]<=122)
arr[i]=arr[i]-32;
}
}
int main()
{
char arr[100];
scanf("%[^\n]",arr);
str_swapcase(arr);
printf("%s",arr);
return 0;
}
60.元宇宙A+B
#include<stdio.h>
#include<string.h>
char num[36] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'};
int strtoint(char a)
{
int ans = 0;
if ( a >= '0' && a <= '9')
ans=a-'0';
else if(a>='A' && a<='Z')
ans=10+a-'A';
return ans;
}
int add(char* arr1,char* arr2,int m,char* ans)//返回最后一个元素的下标
{
int Cin=0;
int j=0;
for(int i=m-1;i>=0;i--)
{
int a=strtoint(arr1[i])+strtoint(arr2[i]);
if(a<36)
{
ans[j]=num[a+Cin];
Cin=0;
}
else
{
ans[j]=num[a-36+Cin];
Cin=1;
}
j++;
}
if(Cin==1)
{
ans[j]=num[1];
return j;
}
return j-1;
}
int main()
{
char arr1[1000];
char arr2[1000];
char ans[1000];
scanf("%s", arr1);
getchar();
scanf("%s", arr2);
int len1=strlen(arr1);
int len2=strlen(arr2);
//对齐操作
if(len1<len2)
{
int n=len2-len1;
memmove(arr1+n,arr1,strlen(arr1));
for(int i=0;i<n;i++)
{
arr1[i]='0';
}
}
else if(len1>len2)
{
int n=len1-len2;
memmove(arr2+n,arr2,strlen(arr2));
for(int i=0;i<n;i++)
{
arr2[i]='0';
}
}
//相加
int m=len1>len2?len1:len2;
int x=add(arr1,arr2,m,ans);
//输出
for(int i=x;i>=0;i--)
{
printf("%c",ans[i]);
}
return 0;
}
61.有效表达式
#include<stdio.h>
typedef long long int ll;
long long int C(int a,int b)//求组和数
{
ll x=1,y=1,z=1;
for(int i=2;i<=a;i++)
{
x*=i;//a的阶乘
}
for(int i=2;i<=b;i++)
{
y*=i;//b的阶乘
}
for(int i=2;i<=a-b;i++)
{
z*=i;//a-b的阶乘
}
return x/(z*y);
}
int main()
{
int n;
scanf("%d",&n);
ll ans=C(2*n,n)-C(2*n,n+1); //具体推导请搜索 卡特兰数
printf("%lld",ans);
return 0;
}
62.循环排序
#include <stdio.h>
void swap(int *a, int *b) {
int tmp = *a;
*a = *b, *b = tmp;
}
void cycleSort(int arr[], int n) {
for (int i = 0; i < n - 1; ++i) {
int item = arr[i], pos = i;
for (int j = i + 1; j < n; ++j) if (arr[j] < item) ++pos;
if (pos == i) continue;
swap(&arr[pos], &item);
while(pos != i) {
pos = i;
for (int j = i + 1; j < n; ++j) if (arr[j] < item) ++pos;
while (item == arr[pos]) ++pos;
swap(&arr[pos], &item);
}
}
}
int main() {
int n;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
cycleSort(arr, n);
for (int i = 0; i < n; ++i) printf("%d ", arr[i]);
return 0;
}
64.Arduino显示
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int ans=0;
int flag=0;
int arr[100]={6,2,5,5,4,5,6,3,7,6};
for(int i=10;i<=99;i++)
{
int t=i;
while(t)
{
arr[i]+=arr[t%10];
t/=10;
}
}
for(int i=0;i<=99;i++)
{
for(int j=0;j<=99;j++)
{
if( arr[i]+arr[j]+arr[i+j]==n-4 && i+j<100)
ans++;
else
continue;
if(i==j)
flag++;
}
}
ans-=flag/2;
printf("%d",ans);
return 0;
}
65.时钟A-B
#include<stdio.h>
#include<time.h>
int main()
{
struct tm timeA,timeB;
scanf("%d %d %d %d %d %d",&timeA.tm_year,&timeA.tm_mon,&timeA.tm_mday,&timeB.tm_year,&timeB.tm_mon,&timeB.tm_mday);
//time_t ans=(time_t)mktime(&timeA)-(time_t)mktime(&timeB);
// 调整日期的格式
timeA.tm_year -= 1900;
timeA.tm_mon -= 1;
timeB.tm_year -= 1900;
timeB.tm_mon -= 1;
// 设置时间为0点
timeA.tm_hour = 0;
timeA.tm_min = 0;
timeA.tm_sec = 0;
timeB.tm_hour = 0;
timeB.tm_min = 0;
timeB.tm_sec = 0;
time_t time1=mktime(&timeA);
time_t time2=mktime(&timeB);
double ans = difftime(time1, time2);
// printf("%ld\n",time1);
printf("%.6lf",ans);
return 0;
}
66.加密字串
#include<stdio.h>
#include<string.h>
int main()
{
char arr[100];
int x;
scanf("%s",arr);
scanf("%d",&x);
char ans[100];
strcpy(ans,arr);
int n=strlen(arr);
int flag=0;
for(int i=0;i<n;i++)
{
flag=0;
for(int j=0;j<n;j++)
{
if(arr[j]==ans[i])
flag++;
}
if(flag&1)
{
ans[i]-=x;
if(ans[i]<'a')
ans[i]+=26;
else if(ans[i]>'z')
ans[i]-=26;
}
else
{
ans[i]+=x;
if(ans[i]<'a')
ans[i]+=26;
else if(ans[i]>'z')
ans[i]-=26;
}
}
printf("%s",ans);
return 0;
}
67.DNA双螺旋结构
#include<stdio.h>
void print1()
{
printf(" AT\n");
printf(" T--A\n");
printf(" A----T\n");
printf("T------A\n");
}
void print2()
{
printf("T------A\n");
printf(" G----C\n");
printf(" T--A\n");
printf(" GC\n");
}
void print3()
{
printf(" CG\n");
printf(" C--G\n");
printf(" A----T\n");
printf("A------T\n");
}
void print4()
{
printf("T------A\n");
printf(" A----T\n");
printf(" A--T\n");
printf(" GC\n");
}
void print5()
{
printf(" AT\n");
printf(" C--G\n");
printf(" T----A\n");
printf("C------G\n");
}
void print6()
{
printf("C------G\n");
printf(" T----A\n");
printf(" G--C\n");
printf(" AT\n");
}
int main()
{
void(*p[6])()={print1,print2,print3,print4,print5,print6};
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int t=i%6;
p[t]();
}
return 0;
}
68.三元搜索
#include<stdio.h>
int Ternary_search(int *arr,int n,int key)
{
int left=0;
int right=n-1;
int mid1,mid2;
while(mid1<=mid2)
{
mid1=left+(right-left)/3;
mid2=right-(right-left)/3;
if(key==arr[mid1])
return mid1;
else if(key==arr[mid2])
return mid2;
else if(key<mid1)
right=mid1-1;
else if(key>arr[mid2])
left=mid2+1;
else
{
left=mid1+1;
right=mid2-1;
}
}
return -1;
}
int main()
{
int arr[1000];
int n,key;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
scanf("%d",&key);
int ans=Ternary_search(arr,n,key);
printf("%d in [%d]",key,ans);
return 0;
}
69.PID控制
#include<stdio.h>
typedef struct PIDController
{
double Kp,Ki,Kd;//比例,积分,微分系数
double preError,integral;//前次误差,积分
}PID;
double PIDCalculate(PID* pid,double setpoint,double measuredValue)
{
double error=setpoint-measuredValue;
pid->integral+=error;
double a=error-pid->preError;
double output=pid->Kp*error+pid->Ki*pid->integral+pid->Kd*a;
pid->preError=error;
return output;
}
int main()
{
PID p;
PID* pid=&p;
double setpoint,measuredValue;
pid->preError=0;
pid->integral=0;
scanf("%lf %lf %lf",&pid->Kp,&pid->Ki,&pid->Kd);
scanf("%lf %lf",&setpoint,&measuredValue);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
measuredValue+=PIDCalculate(pid,setpoint,measuredValue);
printf("%d %.6lf\n",i,measuredValue);
}
return 0;
}
70.长安
#include<stdio.h>
int C(int a,int b)//求组和数
{
int x=1,y=1,z=1;
for(int i=2;i<=a;i++)
{
x*=i;//a的阶乘
}
for(int i=2;i<=b;i++)
{
y*=i;//b的阶乘
}
for(int i=2;i<=a-b;i++)
{
z*=i;//a-b的阶乘
}
return x/(z*y);
}
int main()
{
int bx;
int by;
int px;
int py;
//输入
for(int i=0; ;i++)
{
scanf("%d %d %d %d",&bx,&by,&px,&py);
if(bx<=0 || by<=0 || px<=0 || py<=0)
break;
else
{
if(bx>=px && by>=py)
{
int ans=C(bx+by-2,bx-1)-C(px+py-2,px-1)*C(bx+by-px-py,bx-px);
printf("%d\n",ans);
}
else
{
int ans=C(bx+by-2,bx-1);
printf("%d\n",ans);
}
}
}
return 0;
}
71.中位数
#include<stdio.h>
int main()
{
int arr[1000];
double mid[100];
int len[100];
int judge;
int m=0;
for(int i=0; ;i++)
{
scanf("%d",&judge);
if(judge>0)
arr[i]=judge;
else if(judge==0)
{
i--;
len[m]=i;//记录一组数据最大的下标
if(i&1)//偶数个数据,总共i+1个数
mid[m]=(arr[i/2]+arr[i/2+1])/2.0;
else
mid[m]=(double)arr[i/2];
m++;//最终一共有m组数据
continue;
}
else if(judge<0)
break;
}
//print
for(int i=0;i<m;i++)
{
for(int j=0;j<=len[i];j++)
{
printf("%d ",arr[j]);
}
printf("%.6lf\n",mid[i]);
}
return 0;
}
72.热能计算
#include<stdio.h>
int main()
{
int Ti,Tf;
double ml,mr,cl,cr;//liquid,container
scanf("%d %d",&Ti,&Tf);
scanf("%lf %lf",&ml,&cl);
scanf("%lf %lf",&mr,&cr);
double a=ml*cl+mr*cr;
double Q=a*(Tf-Ti);
double Qlp=(ml*cl)/a;
double Qrp=(mr*cr)/a;
printf("%.2lfkJ,%.2lf%%,%.2lf%%",Q/1000,Qrp,Qlp);
return 0;
}
81.上楼梯
#include<stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int dp[n+1][2];
dp[0][0]=1;
dp[1][0]=1;
for(int i=0;i<=n;i++)
{
dp[i][1]=0;
}
for(int i=0;i<m;i++)
{
int p;
scanf("%d",&p);
dp[p][1]=1;
if(p==1)
dp[1][0]=0;
}
for(int i=2;i<=n;i++)
{
if(dp[i][1])
dp[i][0]=0;
else
{
dp[i][0]=(dp[i-1][0]+dp[i-2][0])%1000000007;
}
}
printf("%d",dp[n][0]);
return 0;
}
82.子数组最大和
#include<stdio.h>
int main()
{
int arr[1000];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
int start=arr[0];
int max=0;
int sum=arr[0];
for(int i=1;i<n;i++)
{
sum+=arr[i];
if(sum<arr[i])//如果加到arr[i]的数还不如arr[i]大,说明从i开始更好
sum=arr[i];
if(sum>max)
max=sum;
}
printf("%d",max);
return 0;
}