记录 && 包括一些规范的输入输出 【c++】

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n ;
    cin>>n;
    int a[n];
    double sum_avg = 0,sum_d = 0,f[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum_avg += a[i];
    }
    sum_avg = sum_avg/n;
    for(int i=0;i<n;i++){
        sum_d += pow((sum_avg-a[i]),2);
    }
    sum_d = sum_d/n;
    for(int i=0;i<n;i++){
        printf("%f\n",(a[i]-sum_avg)/sqrt(sum_d));
    }
}
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.valueOf(sc.nextLine());
        String s = sc.nextLine();
        String[] strIn = s.trim().split(" ");
        int[] nums = new int[strIn.length];
        for (int i = 0; i < strIn.length; i++) {
            nums[i] = Integer.parseInt(strIn[i]);
        }

        double sum = 0;
        for (double num : nums)  sum += num;
        double arg = sum / n;


        double tmp=0;
        for(int num:nums) tmp+=(num-arg)*(num-arg);
        double var=tmp/n;


        double standvariance=Math.sqrt(var);


        double tep=0;
        for(int num:nums)  System.out.println((num-arg)/standvar);

    }
}

要点

第一行输入一个整数
第二行输入一个以空格分隔的数组

Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();//成功获取第一行输入 3
      String s = scanner.nextLine();//第二行输入获取不到,直接返回空字符串 ""

之所以出现这种情况是因为nextInt()调用后将键盘输入的第一行数据读走后会留下换行符,nextLine()遇到了换行符就直接返回了,因为nextInt()已经把数据读走了,所以会返回""

  • 每一行读取都用nextLine()

     Scanner scanner = new Scanner(System.in);
     int i=Integer.valueOf(scanner.nextLine());//第一行
     String s = scanner.nextLine();//第二行
    
  • 第一行用nextInt(),第二行调用两次nextLine()

     Scanner scanner = new Scanner(System.in);
     int i = scanner.nextInt();//第一行
     String s = scanner.nextLine();//获取空字符串
     s = scanner.nextLine();//获取第二行输入
    

输入一个以空格分隔的数组
以字符串的形式读入并String[] strIn = s.trim().split(" ");
然后把字符串按照空格分隔开来,分成字符串数组。再创建一个整型数组用来接收最后for循环解析。

数据类型转换
int除以int结果是int

使用memset对数组进行初始化

memset(数组名,赋的初值,sizeof(数组名));
//用法举例
memset(a, 0, sizeof(a));
其作用为把数组a的所有元素初始化为0。需要注意两点

第三个参数并非填写数组长度,而是数组的大小,这里的大小是指以字节为单位
这个方法赋初值只能赋0和-1,因为他们的补码表示为全0和全1,所以按字节赋值不会出错,如果赋其他的值,则会出错

设置输出精度

fixed补零
setprecision(x)
cout<<a<<“/”<<fixed<<setprecision(1)<<x<<“=”<<b;

强制转换

在这里插入图片描述

输入以空格、逗号分隔,输出以逗号分隔

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<double> nums;
    double a;
    while(cin>>a){
        nums.push_back(a);
        if(cin.get()=='\n') break;
    }

    cout<<fixed<<setprecision(2)<<nums[0]<<",";
    for(int i=1;i<nums.size()-1;i++){
        nums[i]=nums[i-1]+nums[i];
        cout<<fixed<<setprecision(2)<<nums[i]<<",";
    }
    cout<<nums[nums.size()-2]+nums[nums.size()-1];
}

回文数

#include<bits/stdc++.h>
using namespace std;
/* //转换为字符串
int ispallindrome(int n){
    string temp=to_string(n);
    for(int i=0;i<temp.size()/2;i++){
        if(temp[i]==temp[temp.size()-1]) continue;
        else return 0;
    }
    return 1;
}
*/
int ispallindrome(int n){
    int p=n;
    int k=0;
    while(p!=0){
        k=k*10+p%10;
        p=p/10;
    }
    if(k==n) return 1;
    else return 0;

}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<=n;i++){
        if(ispallindrome(i)) cout<<i<<endl;
    }
}

十六进制转十进制


```cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    int n=s.length();
    long long ans=0;
    for(int i=0;i<n;i++){
        if(s[i]>='0'&&s[i]<='9'){
            ans+=s[i]-'0';
        }
        else if(s[i]>='a'&&s[i]<='f'){
            ans+=s[i]-'a'+10;
        }
        else if(s[i]>='A'&&s[i]<='F'){
            ans+=s[i]-'A'+10;
        }

        if(i<n-1)
            ans*=16;
    }
    cout<<ans;
}

凯撒密码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a;
    int n;
    getline(cin, a);
    cin>>n;
    n=n%26;
	for(int i=0;a[i];i++)
	{
		if(isupper(a[i]))
		{
			int temp=a[i]-'A';
			a[i]=(temp+n+26)%26+'A';//temp+n+26偏移量
		}
		if(islower(a[i]))
		{
			int temp=a[i]-'a';
			a[i]=(temp+n+26)%26+'a';
		}
		
	}
	cout<<"Encrypted message:"<<a;
}

unsiged

#include <stdio.h>
int main(){
    int v;
    scanf("%d",&v);
    printf("%x",v);
    unsigned char *p=(unsigned char *)(&v);
    printf("\n%x %x %x %x",p[0],p[1],p[2],p[3]);
}

// v的地址是int*类型,其对象是int型的4字节的12345678,
// 当其强制转换成unsigned char*类型的q时,由于char是1个字节,
// 所以其对象会被一个字节一个字节的拆分,由于内存中是小端存储
// ( 低地址存低位,高地址存高位),
// 所以q[0]是4字节的12345678在内存中的第一个字节,
// 依次类推(12345678所占的4个字节被强制拆成了4个单字节的存储),
// 所以最后输出为 4e 61 bc 0 。

数组实现循环队列

bool AddQ( Queue Q, ElementType X ){
	//队列满了时打印"Queue Full" 并返回 false
		if(Q->MaxSize==Q->Count){
		printf("Queue Full\n");
		return false;
	}
	//当队列没满但队首指针指向数组末尾时
	//需要让该指针循环回数组首端。
	if(Q->Front==Q->MaxSize)
	Q->Front=0;
	Q->Data[Q->Front] = X;
	(Q->Front)++;
    (Q->Count)++;
    return true;
}
ElementType DeleteQ( Queue Q ){
	if(Q->Count==0){
		printf("Queue Empty\n");
		return ERROR;
	}
	
	//考虑到出队元素可能比队首指针指向的元素靠前,故需要加上 Q->MaxSize
	//如果不用加的话,取余操作即可将多加的 Q->MaxSize消除
	int index = (Q->Front + Q->MaxSize - Q->Count) % Q->MaxSize;
	int t = Q->Data[index];
	(Q->Count)--;
	return t;
}

第k小的数 快排

设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。

提示:函数int partition(int a[],int left,int right)的功能是根据a[left]a[right]中的某个元素x(如a[left])对a[left]a[right]进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。因此可以编制int find(int a[],int left,int right,int k)函数,通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。

#include <iostream>
using namespace std;
int partition(int a[], int left, int right)
{//将数组a的第left到right个元素进行划分
	int x = a[left];

	while (left < right)
	{//采用快排策略
		while (left < right && a[right] >= x)
			right--;
        cout<<a[left]<<"+"<<a[right]<<endl;
		a[left] = a[right];

		while (left < right && a[left] <= x)
			left++;
        cout<<a[left]<<"+"<<a[right]<<endl;
		a[right] = a[left];
	}

	a[left] = x;

	return left;
}

int find(int a[], int left, int right, int k)
{//在数组a的第left到right中寻找第k小的数
	int pos = partition(a, left, right);

	if (k - 1 == pos)
		cout << a[k - 1];
	else if (k - 1 < pos){
        cout<<"xin左边"<<endl;//判断下一次划分在哪一区间进行
		find(a, left, pos - 1, k);
	}
	else{
        cout<<"xin右边"<<endl;
		find(a, pos + 1, right, k);
	}

	return 0;

}


int main(){
    int n,k;
    int a[1001];
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }

	find(a, 0, n - 1, k);
}

回溯 全排列、组合

(参考回溯 代码随想录
组合:因为(1,2)=(2,1),所以需要设置一个startIndex来避免在横向遍历中回选
全排列:区别于组合,不需要startIndex,设置一个used数组来保存选过的数字

排列
#include<bits/stdc++.h>
using namespace std;
vector<int> path;
vector<vector <int>> result;
void backtracking(int n,int m,vector<int> &path,vector<bool> &used){
    if(path.size()==m){
        result.push_back(path);
        return;
    }
    for(int i=1;i<=n;i++){
        if (used[i] == true) continue; // path里已经收录的元素,直接跳过
            used[i] = true;
            path.push_back(i);
            backtracking(n,m,path,used);
            path.pop_back();
            used[i] = false;
    }
}

int main(){
    int n,m;
    cin>>n>>m;
    vector<bool> used(10,false);
    backtracking(n,m,path,used);
    for(auto i:result){
        for(auto j:i) cout<<j<<" ";
        cout<<endl;
    }
    cout<<result.size();
}
组合
#include<bits/stdc++.h>
using namespace std;
void backtracking(int n,int m,int startIndex,vector<int> &path,vector<vector<int>> &result){
    if(path.size()==m){
        result.push_back(path);
    }
    for(int i=startIndex;i<=n;i++){
        path.push_back(i);
        backtracking(n,m,i+1,path,result);
        path.pop_back();
    }
}

int main(){
    int n,m;
    cin>>n>>m;
    vector<vector <int>> result;
    vector<int> path;
    backtracking(n,m,1,path,result);
    for(auto i:result){
        for(auto j:i) cout<<j<<" ";
        cout<<endl;
    }
 }

7-7 最少加油数
一辆加满油的汽车欲行驶到m公里外的终点,旅途中有若干加油站,并且每个加油站距离起点的公里数已知,汽车加满油后可行驶n公里。如何用最少的加油次数到达目的地。

输入格式:
第一行输入终点公里数m,和汽车加满油可行驶的公里数n,以及加油站的个数k。第二行输入k个整数分别代表从起点到终点的k个加油站距离起点的公里数。

输出格式:
输出最少的加油次数。

输入样例:
在这里给出一组输入。例如:

10 6 3
2 5 9
输出样例:
在这里给出相应的输出。例如:

1

#include<bits/stdc++.h>
using namespace std;
int main(){
    int m,n,k;
    int a[100];
    cin>>m>>n>>k;
    for(int i=0;i<k;i++){
        cin>>a[i];
    }
    int num=0;

    for(int j=0;j<k;j++){
            if(n-a[j]<=a[j+1]-a[j]){
              num++;
              n+=a[j];
            }
            if(n>=m) break;
        }

    cout<<num;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值