#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;
}