PAT--B--数学

Callatz猜想

1001

// 1.没有读懂题目, 还是多读PAT原题



#include <stdio.h>
#include <iostream>

using namespace std;

int main(){
    int n;
    scanf("%d", &n);
    int count = 0;
    while(n != 1){
        if(n % 2 != 0){
            n = (3 * n + 1) / 2;
            count ++;
        }
        else{
            n /= 2;
            count ++;
        }
    }
    printf("%d\n", count);
    return 0;
}

素数对猜想

1007

//Step1:找到所有素数
//Step2:两两相减, 做cnt

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N,j=2,B[100000];  //B[i]代表第i个质数。
    int num=0;
    B[1]=2;
    cin>>N;
    bool judge(int);
    for(int i=3;i<=N;i++)
    {
        if(judge(i))
        {
            B[j]=i;
            j++;
        }
    }   //找出了N以内所有的质数。
    for(int i=1;i<j-1;i++)
    {
        if(B[i+1]-B[i]==2)
        {
            num++;
        }
    }
    cout<<num;
    return 0;
}
bool judge(int x)    //true为质数
{
    if(x==2) {return 1;}
    for(int j=2;j<sqrt(x)+1;j++)
    {
        if(x%j==0) {return 0;}
    }
    return 1;
}

矩阵右移

1008

//整体思想: 矩阵的转置
//Step1: 对整体转置
//Step2: 对前半部转置
//Step2: 对后半部转置
//结果: 右移

//注意点:
//当移动的个数m > 数组长度n时,m需要对n取模,即 m%=n


#include <iostream>
#include <string>
using namespace std;

void reverse(int a[], int begin, int end) {  // 数组逆序存放
	for (int i = begin, j = end-1; i <= j; i++, j--) {
		int tmp = a[i];
		a[i] = a[j];
		a[j] = tmp; 	
	}
} 

int main() {
	int a[105] = {0}, n = 0, m = 0;
	cin >> n >> m;
	for (int i =0; i < n; i++)
		cin >> a[i];
	
    m %= n;                             // 移动的值m > 数组长度n
    
	reverse(a, 0, n);                   
	reverse(a, 0, m);
	reverse(a, m, n);
	
	for (int i =0; i < n; i++) {
		cout << a[i];
		if (i != n-1)	cout << " ";    // 序列结尾不能有多余空格
	}
	cout << endl;
	
	return 0;
}

一元多项式求导

1010

#include <iostream>
using namespace std;

int main() {
	int coeff = 0, expon = 0;
	cin >> coeff >> expon;
	if (expon == 0) {
		cout << "0 0" << endl;
		return 0;
	}
	else 
		cout << coeff*expon << " " << expon-1;
	
	while (cin >> coeff >> expon) {
		if (expon != 0)
			cout << " " << coeff*expon << " " << expon-1;
	}
							
	return 0;
}

int和 long long的范围

1011

//int和 long long 的范围:
//	(1)int: 2^31,  2147483648(共十位)
//	(2)long long: 2^63, 9223372036854775808(共19位)

//所以, 这道题只需要用long long来接受数据即可AC


#include<iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int cnt = 1;
    while(n--)
    {
        long long a, b, c;
        cin >> a >> b >> c;
        if(a+b>c)
            printf("Case #%d: true\n", cnt++);
        else
            printf("Case #%d: false\n", cnt++);
    }
    return 0;
}

数字分类

1012

//题目看似要求多, 其实每个只有一行代码, 用switch解决即可

#include <iostream>
#include<string>
#include<vector>
#include<sstream>
#include <iomanip> 
using namespace std;
 
int main() {
	int n, in;
	int A1 = 0, A2 = 0, A3 = 0, A5 = 0;
	double A4 = 0; int A4T = 0;
	cin >> n;
	int flag = 1;
	int A2T = 0;
	while (n--) {
		cin >> in;
		if (in % 5 == 0 && in % 2 == 0)	//能被 5 整除的数字中所有偶数的和;
			A1 += in;
		else if (in % 5 == 1) {			//被5整除后余1的数字交错求和,n1-n2+n3-n4...
			A2T++;
			in = in * flag;
			A2 += in;
			flag *= -1;
		}
		else if (in % 5 == 2) {			//能被5整除余2的树的个数
			A3++;
		}
		else if (in % 5 == 3) {			//被5整除后余3的树的平均值,保留一位小数
			A4 += in;
			A4T++;
		}
		else if (in % 5 == 4) {			//被5整除余4中数字最大的数字
			if (in > A5)
				A5 = in;
		}
	}
	if (A1 != 0)
		cout << A1 << " ";
	else
		cout << "N ";
	if (A2T == 0)
		cout << "N ";
	else
		cout << A2 << " ";
	if (A3 == 0)
		cout << "N ";
	else
		cout << A3 << " ";
	if (A4 == 0)
		cout << "N ";
	else
		printf("%.1f ", A4 / A4T);
	if (A5 == 0)
		cout << "N" << endl;
	else
		cout << A5 << endl;
	return 0;
}

倒正金字塔打印

1027

//打印就是找规律

#include<stdio.h>
#include<math.h>

int main(){
    char sign;
    int N,n,an;		//输入的字符数N,每个金字塔层数n,底层字符数an
    scanf("%d %c",&N,&sign);
    n=sqrt((N+1)/2);	//计算每层金字塔数
    an=2*n-1;			//计算底层字符数
    for(int i=0;i<n;i++){	//输出倒金字塔
        for(int j=0;j<i;j++){	//输出空格
            printf(" ");
        }
        for(int k=0;k<an-i*2;k++){	//输出相应字符
        	printf("%c",sign);
		}
        printf("\n");
    }
    for(int i=n-2;i>=0;i--){	//输出缺少顶层的正金字塔
        for(int j=i;j>0;j--){		//输出空格
            printf(" ");
        }
        for(int k=an-i*2;k>0;k--){		//输出相应字符
        	printf("%c",sign);
		}
        printf("\n");
    }
    printf("%d",N-2*n*n+1);		//输出剩余字符的运算结果
    return 0;
}

旋转矩阵打印

1050

//1.确定长方形边长(尽量正): 从sqrt开始
//2.绘制螺旋矩阵: 行数, 列数, 圈数, 然后按最外面一圈仔细算就行

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;

vector<int>inputs;
vector<vector<int> >results;

bool cmp(int a, int b) {
	return a > b;
}

int main() {

	int n;
	scanf("%d", &n);
	inputs.resize(n);

	for (int i=0; i < n; i++) {
		scanf("%d", &inputs[i]);
	}

	sort(inputs.begin(), inputs.end(), cmp);

	int row, column;
	for (row = ceil(sqrt(n)); row <= n; row++) {
		if (n%row == 0) {
			column= n / row;
			break;
		}
	}



	results.resize(row);
	for (int i = 0; i < row; i++)results[i].resize(column);

	int count = 0;
	int quan = 0;
	while (count<n) {
		for (int j = quan; j < (column - quan) && count < n; j++) {
			results[quan][j] = inputs[count++];
		}
		for (int i = quan + 1; i < row - quan && count < n; i++) {
			results[i][column - quan - 1] = inputs[count++];
		}
		for (int j = column - quan - 2; j >= quan && count < n; j--) {
			results[row - quan - 1][j] = inputs[count++];
		}
		for (int i = row - quan - 2; i > quan && count < n; i--) {
			results[i][quan] = inputs[count++];
		}
		quan++;

	}

	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++) {
			if (j != 0)printf(" ");
			printf("%d", results[i][j]);
		}
		printf("\n");
	}


	return 0;
}

正方形打印+四舍五入

1036

//1.四舍五入取整:
//	(1)+ 0.5 
//	(2)floor()

//2.图形打印肯定是一行一行输出的, 思考和写的时候这个作为向导

#include<iostream>
#include<math.h>
using namespace std;
int main()
{

    double N;
    char C;
    int column=0;
    cin>>N>>C;
    column=floor(N/2+0.5);
    for(int i=0;i<N;i++)  //先输出第一行N个
    cout<<C;
    cout<<endl;
    for(int i=0;i<column-2;i++)//依次输出第二到倒数第二行
    {
        cout<<C;
        for(int j=0;j<N-2;j++)//每行又有N-2个空格
        cout<<" ";
        cout<<C<<endl;        //每行输出完后换行
    }
    for(int i=0;i<N;i++)      //输出最后一行
    cout<<C;
    return 0;
} 

打分(去除最大最小值+四舍五入)

1077

//1.去除最大最小值用排序
//2.四舍五入

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	int N, M;
	cin >> N >> M; 
	for(int i = 0; i < N; i++){
		int tmp, score[500] = {0}, cnt = 0;
		double G1 = 0.0, G2;
		cin >> G2; 
		for(int j = 1; j < N; j++){
			cin >> tmp;
			if(tmp >= 0 && tmp <= M)
				score[cnt++] = tmp;
		}
		sort(score, score+cnt);
		for(int i = 1; i < cnt-1; i++)
			G1 += score[i];
		cnt -= 2;
		cout << (int)((G1/cnt + G2)/2.0+0.5) << endl;
	}
	return 0;
} 

最简分数

1062

#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a,int b){
    return a % b == 0 ? b : gcd(b,a%b);
}
int main(){
    int n_1,n_2,m_1,m_2,k;
    scanf("%d/%d %d/%d %d",&n_1,&m_1,&n_2,&m_2,&k);
    bool flag = false;
    if(n_1 * m_2 > n_2 * m_1){
        swap(n_1,n_2);
        swap(m_1,m_2);
    }
    for (int i = 1; i < k; ++i) {
        if(gcd(i,k) == 1 && i * m_2 < n_2 * k && i * m_1 > n_1 * k)
            if(flag)
                cout<<" "<<i<<"/"<<k;
            else{
                cout<<i<<"/"<<k;
                flag = true;
            }
    }
    return 0;
}

有理数四则运算

1034


//1.积累: 最大公因式gcd函数的编写
//2.积累: 分式加法的代码块



#include <cstdio>
#include <cmath>


using namespace std;

long long  a1, a2, b1, b2, a, b, gcdValue;


long long gcd(long long a, long long b) {
	return b == 0 ? abs(a) : gcd(b, a%b);
}

void print(long long x, long long y){

	//如果是负数
	if (x < 0)printf("(");

	//如果输入还有公因式
	gcdValue = gcd(x, y);

	if (gcdValue) {
		x /= gcdValue;
		y /= gcdValue;
	}

	//如果是整数
	if (x%y == 0) {
		printf("%lld", x / y);
	}
	else {	//如果非整数

		long long integer = x / y;
		long long tmpX=x;
		if(integer) tmpX = abs(x) - abs(integer) * y;

		if (integer != 0) {
			printf("%lld ", integer);
		}
		printf("%lld/%lld", tmpX, y);

	}

	if (x < 0)printf(")");

}

void sum() {

	long long sum1, sum2;
	sum2 = a2 * b2;
	sum1 = a1 * b2 + a2 * b1;

	gcdValue = gcd(sum1, sum2);
	if (gcdValue) {
		sum1 /= gcdValue;
		sum2 /= gcdValue;
	}

	print(a1, a2);
	printf(" + ");
	print(b1, b2);
	printf(" = ");
	print(sum1, sum2);

}

void difference() {

	long long dif1, dif2;
	dif2 = a2 * b2;
	dif1 = a1 * b2 - a2 * b1;

	gcdValue = gcd(dif1, dif2);

	if (gcdValue) {
		dif1 /= gcdValue;
		dif2 /= gcdValue;
	}

	print(a1, a2);
	printf(" - ");
	print(b1, b2);
	printf(" = ");
	print(dif1, dif2);

}

void product() {

	long long pro1, pro2;
	pro2 = a2 * b2;
	pro1 = a1 * b1;

	gcdValue = gcd(pro1, pro2);
	if (gcdValue) {
		pro1 /= gcdValue;
		pro2 /= gcdValue;
	}

	print(a1, a2);
	printf(" * ");
	print(b1, b2);
	printf(" = ");
	print(pro1, pro2);
}

void quotient() {

	long long quo1, quo2;
	quo2 = a2 * b1;
	quo1 = a1 * b2;
	if (quo2 < 0) {
		quo1 *= -1;
		quo2 *= -1;
	}


	gcdValue = gcd(quo1, quo2);
	if (gcdValue) {
		quo1 /= gcdValue;
		quo2 /= gcdValue;
	}


	print(a1, a2);
	printf(" / ");
	print(b1, b2);
	printf(" = ");
	if (b1 == 0)printf("Inf");
	else print(quo1, quo2);


	
	
}


int main() {

	scanf("%lld/%lld %lld/%lld", &a1, &a2, &b1, &b2 );

	sum();
	printf("\n");
	difference();
	printf("\n");
	product();
	printf("\n");
	quotient();

	return 0;
}

复数乘法

1051

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cmath>

using namespace std;

int main()
{
    double r1,p1,r2,p2;
    cin>>r1>>p1>>r2>>p2;
    double a1,b1,a2,b2;
    a1 = cos(p1)*r1;
    b1 = sin(p1)*r1;
    a2 = cos(p2)*r2;
    b2 = sin(p2)*r2;
    double A,B;
    A = a1*a2-(b1*b2);
    if(fabs(A)<0.01) A=0;   //此处防止负0
    B = a1*b2+a2*b1;
    if(fabs(B)<0.01) B=0;
    if(B>=0) //此处是当B为0时也用加号
        printf("%.2f+%.2fi",A,B);
    else
        printf("%.2f-%.2fi",A,abs(B));
    return 0;
}

我要通过(找规律, 字符个数统计)

1003

//提干思路总结成人话:
//	(1)必须仅有PAT, 这三种字符, 不可以包含其他字符
//	(2)只能有一个P, T
//	(3)P和T之间不能没有A
//	(4)P要在T左边
//	(5)左边A的个数*中间A的个数=右边A的个数

#include <cstdio>
#include <cstring>
using namespace std;

int n,t,p,ok,np,nt;
char inn[110];

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;++i){
       ok=1;np=nt=0;
       scanf("%s",inn);
       for(int j=0;inn[j];++j){
           if(inn[j]!='P' && inn[j]!='A' && inn[j]!='T')
               ok=0;
           if(inn[j]=='P') {p=j;np++;}
           if(inn[j]=='T') {t=j;nt++;}
       }
       if(np==1 && nt==1 && t-p>1 && ok && strlen(inn)-t-1==(t-p-1)*p)
            printf("YES\n");
       else
            printf("NO\n");
    }
    return 0;
}

数PAT

1040

// 1.思路:对于每个A, 前面的P, 和后面的T的乘积, 加和
// 2.1+8个0+7 的运算的操作数都要模哦


#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    int len = s.length(), result = 0, countp = 0, countt = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] == 'T')
            countt++;
    }
    for (int i = 0; i < len; i++) {
        if (s[i] == 'P') countp++;
        if (s[i] == 'T') countt--;
        if (s[i] == 'A') result = (result + (countp * countt) % 1000000007) % 1000000007;
    }
    cout << result;
    return 0;
}

数列片断和(有时间限制)

1049

//1.scanf关于小数的输入和输出:
	//(1)输入:  float:%f,  double:%lf  (注意: 直接f,lf就好不要输出格式)
	//(2)输出:  %.1f, %.1lf  (即加格式就好)
	//(3)注意: !!!!接受的变量数据类型一定匹配, 不然输入输出完全对不上
//2.复杂循环的写法: 先从最简单的层开始解析, 外面的层其实是确定里面的界限
//3.看时间限制: 记住公式--每个元素出现的次数= (n-i)*(i+1),  这样就将需要三层循环的事情变成一层循环(即统计每个元素出现的次数)
//4.过程中使用float没使用double也会出错(尽量使用double)

#include <stdio.h>
#include <vector>

using namespace std;

vector<double>inputs;

int main() {
	int n;
	scanf("%d", &n);
	inputs.resize(n);

	for (int i = 0; i < n; i++) {
		scanf("%lf", &inputs[i]);
	}


	double sum = 0;
	for (int i = 0; i < n; i++) {
		sum += inputs[i] * (n - i)*(i + 1);  //记住这个公式
	}

	printf("%.2lf\n", sum);

	return 0;
}

组合数的和(枚举)

1056

//两层循环枚举, 累加即可

#include<iostream>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    
    int a[15] = {0};
    for (int i = 0; i < n; i++)
        cin >> a[i];
    
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i != j)
            {
                sum += a[i]*10 + a[j];
            }
        }
    }
    cout << sum << endl;
    
    return 0;
}

爱丁堡数

1060

//1.爱丁堡数柳神的逻辑实在没懂, 下次遇到直接公式背出来:inputs[i]>i+1

#include <iostream>
#include <algorithm>
using namespace std;
int a[1000000];
int main() {
    int n, e = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    sort(a, a+n, greater<int>());
    while(e < n && a[e] > e+1) e++;
    printf("%d", e);
    return 0;
}

计算谱半径

1063

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int main(){
	int n=0,a=0,b=0;
	float max_ans=0,temp=0;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a>>b;
		temp=sqrt(pow(a,2)+pow(b,2));
		max_ans=max(max_ans,temp);
	}
	//max_ans+=0.005;
	printf("%.2f",max_ans);
	return 0;
}

不同进制加法

1074

#include <iostream>
#include <string>
using namespace std;
int main() {
	string s, s1, s2, ans;
	int carry = 0, flag = 0;
	cin >> s >> s1 >> s2;
	ans = s;

    //补到和进制等长
	s1.insert(s1.begin(), s.length() - s1.length(), '0');  
	s2.insert(s2.begin(), s.length() - s2.length(), '0');

    //按进制进行加法
	for (int i = s.length() - 1; i >= 0; i--) {
		int mod = s[i] == '0' ? 10 : (s[i] - '0');
		ans[i] = (s1[i] - '0' + s2[i] - '0' + carry) % mod + '0';
		carry = (s1[i] - '0' + s2[i] - '0' + carry) / mod;
	}
	if (carry != 0) ans = '1' + ans;
	for (int i = 0; i < ans.size(); i++) {
		if (ans[i] != '0' || flag == 1) {
			flag = 1;
			cout << ans[i];
		}
	}
	if (flag == 0) cout << 0;
	return 0;
}

欧式距离的计算

1082

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin>>n;
	int max = 0,min = 10000;
	string winID,loserID;
	while(n--){
		string ID;
		int x,y;
		cin>>ID>>x>>y;
		int temp = abs(x)*abs(x)+abs(y)*abs(y);
		if(temp>max){
			loserID = ID;
			max = temp;
		}
		if(temp<min){
			winID = ID;
			min = temp;
		}
	}
	cout<<winID<<" "<<loserID;
	return 0;
}

三人行(枚举法)

1088

//枚举甲从99~10

#include <bits/stdc++.h>
using namespace std;
using gg = long long;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    array<double, 3> p{};
    gg mi, xi, yi;
    cin >> mi >> xi >> yi;
    for (gg i = 99; i >= 10; --i) {
        gg j = i % 10 * 10 + i / 10;
        p = {i * 1.0, j * 1.0, j * 1.0 / yi};
        if (abs(p[2] - abs(i - j) * 1.0 / xi) < 1e-9) {
            cout << p[0];
            for (auto i : p) {
                cout << ' ' << (i > mi ? "Cong" : i < mi ? "Gai" : "Ping");
            }
            return 0;
        }
    }
    cout << "No Solution";
    return 0;
}

狼人杀(枚举法)

1089

//思路:题目要求求出两个狼人,就是用假设,双重循环,每次假设i和j是狼人,这样其他的就都是人了
//,然后针对每次假设再去判断所有人所说的话,用一重循环k:先判断k在你的假设结果里是人还是狼,再判断他说的那个人跟你的假设结果符不符合
//,不符合就是说谎话,对应的狼人说谎数+1,或者人说谎数+1。k循环结束就判断这种假设下说谎的狼人数量和说谎的人的数量是不是都是一个,是就是符合的结果
//,并且因为i和j的循环是从1开始的,所以第一次找到的情况就是最小的序列。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,x;
	cin >> n;
	int state[n+1];
	for(int i=1;i<=n;i++) cin >> state[i];//int数组记录每个人说的话
	for(int i=1;i<n;i++){
		for(int j=i+1;j<=n;j++){ //双重循环假设i和j是狼人
			int liewolf=0,lieman=0;
			for(int k=1;k<=n;k++){ //循环k判断所有人说的话和假设的情况的符合程度
				if(k==i||k==j){ //如果k是狼人
					if((abs(state[k])==i||abs(state[k])==j)&&state[k]>0) liewolf++; //k描述的那个人是狼人但他却说他人 k说谎 狼人说谎数+1
					else if(abs(state[k])!=i&&abs(state[k])!=j&&state[k]<0) liewolf++; //k描述的人是人但他却说他是狼人 k说谎 狼人说谎数+1
				}else{ //如果k是人
					if((abs(state[k])==i||abs(state[k])==j)&&state[k]>0) lieman++; //k描述的那个人是狼人但他却说他是人  k说谎 人说谎数+1
					else if(abs(state[k])!=i&&abs(state[k])!=j&&state[k]<0) lieman++; //k描述的那个人是人但他却说他是狼人 k说谎 人说谎数+1
				}
			}
			if(liewolf==1&&lieman==1){
				cout << i << ' ' << j; //每次k循环结束都判断人的说谎数和狼的说谎数,如果都刚好是1则表示当前的假设是对的 否则就进行下一次假设
				return 0;
			}
		}
	}
	cout << "No Solution";
	return 0;
}


自守数(枚举)

1091

//枚举法

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int m = 0;
    cin >> m;
    
    int k = 0, n = 0, nk2 = 0;
    for (int i = 0; i < m; i++)
    {
        cin >> k;
        
        bool flag = false;
        for (n = 1; n < 10; n++)
        {
            nk2 = k * k * n;
            string s = to_string(nk2);
            string s1 = to_string(k);
            string s2 = s.substr(s.size()-s1.size(), s1.size());
            
            if (s1 == s2)
            {
                flag = true;
                break;
            }
        }
        if (flag) cout << n << " " << nk2 << endl;
        else cout << "No" << endl;
    }
    
    return 0;
}

快速排序寻找主元

1045

//排序, 位置不变的就是可能的主元

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    cin>>n;
    vector<int> v(n),sort_v(n);
    vector<int> result;
    
    for(int i=0; i<n; i++)
    {
        cin>>v[i];
        sort_v[i] = v[i];
    }
    
    sort(sort_v.begin(),sort_v.end());
    int max_num = v[0];
    for(int i=0; i<n; i++)
    {
        if(v[i] == sort_v[i] && max_num == v[i]) //确保左边是最大值
            result.push_back(v[i]);
        max_num = max(max_num,v[i+1]);
    }

    cout<<result.size()<<endl;
    for(int i=0; i<result.size(); i++)
    {
        if(i != result.size()-1)
            cout<<result[i]<<' ';
        else
            cout<<result[i];  
    }
    cout<<endl;  //最后要换行,就算主元为0也得换行
    return 0;
}

贪心(打绳结)

1070

// 1.贪心算法:长的绳子尽量少折
// 2.向上取整, 向下取整<math.h>: ceil, floor
// 3.sort默认升序
// 4.有double的关于int的运算记得将一个操作数转化


#include <stdio.h>
#include <vector>
#include <math.h>
#include <algorithm>

using namespace std;

vector<int>inputs;

int main() {

	int n;
	scanf("%d", &n);
	inputs.resize(n);

	for (int i = 0; i < n; i++) {
		scanf("%d", &inputs[i]);
	}

	sort(inputs.begin(), inputs.end());

	double sum = inputs[0];
	for (int i = 1; i < n; i++) {
		sum = floor(sum / 2 + double(inputs[i]) / 2);
	}

	printf("%.0f", sum);


	return 0;
}

谷歌招聘(素数)

1094

//1.判断素数的标准模板
//2.string取子串瞬间反应



//#include <bits/stdc++.h>
#include <iostream>
#include <string>

using namespace std;

bool isPrime(int n) {
	if (n == 0 || n == 1)return false;
	for (int i = 2; i*i <= n; i++)if (n%i == 0)return false;
	return true;
}

int main() {

	int len, n;
	string str;
	cin >> len >> n >> str;

	int i = 0;
	for (; i <= len - n; i++) {  //如果不确定的话, 自己举个简单的例子, 尤其从边界入手
		string result = str.substr(i, n);
		if (isPrime(stoi(result))) {
			cout << result << endl;
			break;
		}
	}
	if (i == (len - n + 1))cout << "404" << endl;

	return 0;
}

素数

1013

#include<iostream>
#include<vector>
using namespace std;
bool isprime(int n)
{
    if(n == 2)
        return true;
    if(n == 3)
        return true;
    else{
        for (int i = 3; i * i <= n;i++)
        {
            if(n%i==0)
                return false;
        }
        return true;
    }
    return true;
}
int main()
{
    int a, b;
    cin >> a >> b;
    vector<int>num(b+1);
    num[1] = 2;
    int n = 3;
    for (int i = 2; i <= b;i++)
    {
        while(!isprime(n))
        {
            n += 2;
        }
        num[i] = n;
        n += 2;
    }
    cout << num[a];
    int t = 1;
    for (int j = a+1; j <= b;j++)
    {
        if(t%10 == 0)
            cout << '\n';
        else
            cout << ' ';
        cout << num[j];
        t++;
        
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值