openjudge程序设计与算法C/C++解题大全

        openjudge是一个在线编程平台,非常适合初学者学习基础的编程语法,笔者将做过的C/C++语言题目答案汇总在下文,供各位参考。题目链接如下:http://cxsjsxmooc.openjudge.cn/2021t1summer2/

001:输出第二个整数

#include<stdio.h>
int main(void)
{
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	printf("%d",b);
	return 0;
}

002:字符菱形

#include<cstdio>

int main()
{
   char a;
   a=getchar();
      printf("  %c\n",a);
      printf(" %c%c%c\n",a,a,a);
      printf("%c%c%c%c%c\n",a,a,a,a,a);
      printf(" %c%c%c\n",a,a,a);
      printf("  %c\n",a);
    return 0;
}

003:打印ASCII码

#include<cstdio>
int main()
{
   char a;
   scanf("%c",&a);
   printf("%d",a);
   return 0;
}

004:打印字符

#include <iostream>  
using namespace std;   
int main(){  
    int n;      //声明变量。
    cin >> n;      //输入字母。
    cout << (char)n;      //输出强转为char类型的变量(即该字母的ASCII码值)。
    return 0;  
}

005:整型数据类型存储空间大小

#include<stdio.h>
int main()
{
    printf("%d %d\n",sizeof(int),sizeof(short));
    return 0;
}

006:浮点型数据类型存储空间大小

#include<stdio.h>
int main()
{
	float a;
	double b;
    printf("%d %d\n",sizeof(a),sizeof(b));
    return 0;
}

007:对齐输出

#include<stdio.h>
int main()
{
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	printf("%8d %8d %8d",a,b,c);
    return 0;
}

008:输出保留12位小数的浮点数

#include<stdio.h>
int main()
{
	double a;
	scanf("%lf",&a);
	printf("%.12f",a);
    return 0;
}

009:空格分隔输出

#include<stdio.h>
int main()
{
	char a;
	int b;
	float c;
	double d;
	scanf("%c\n",&a);
	scanf("%d\n",&b);
	scanf("%f\n",&c);
	scanf("%lf",&d);
	printf("%c %d %f %lf",a,b,c,d);
    return 0;
}

010:计算球的体积

#include<stdio.h>
#include<stdlib.h>
int main()
{
	
	double r;
	double v;
	scanf("%lf",&r);
	v=(4.0)/(3.0)*3.14*r*r*r;
	printf("%.2lf",v);
    return 0;
}

011:大象喝水

#include<stdio.h>
int main()
{
	
	int  r,h,m;
	double v,n;
	scanf("%d %d",&h,&r);
	v=(3.14159)*r*r*h;
	m=int(20000/v)+1;
	
	printf("%d",m);

    return 0;
}

012:奇偶数判断

#include<stdio.h>
int main()
{
	
	int  r;
	scanf("%d",&r);
	if(r%2==1)	
{
	printf("odd");
}
else{printf("even");}	

    return 0;
}

013:求一元二次方程的根

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
    double a, b, c, x1, x2, bb, fourac, twoa;
    cin >> a >> b >> c;
    bb = b*b;
    fourac = 4*a*c;
    twoa = -b/(a*2);
    if (b == 0) twoa = 0;
    if (bb == fourac) {
        cout << fixed << setprecision(5) << "x1=x2=" << twoa << endl;
    }
    else if (bb > fourac) {
        x1 =  (-b + sqrt(b*b-4*a*c))/(2*a);
        x2 =  (-b - sqrt(b*b-4*a*c))/(2*a);
        cout << fixed << setprecision(5) << "x1=" << x1 << ";x2="
             << fixed << setprecision(5)<< x2 << endl;
    }
    else {
        cout << fixed << setprecision(5) << "x1=" << twoa << "+"
             << fixed << setprecision(5)<< sqrt(fourac-bb)/(a*2) << "i;x2="
             << fixed << setprecision(5) << twoa << "-"
             << fixed << setprecision(5) << sqrt(fourac-bb)/(a*2) << "i" << endl;
    }
    return 0;
}

014:点和正方形的关系

#include<stdio.h>
int main()
{
	int x,y;
	scanf("%d %d",&x,&y);
	if(x>=-1&&x<=1&&y>=-1&&y<=1)
	{
		printf("yes");	
	}
	else
	{
		printf("no");
	}
	return 0;
} 

015:苹果和虫子2

#include <iostream>
using namespace std;

int main()
{
    int n,x,y,t;
    cin>>n>>x>>y;
    if(y%x!=0)
    {
    t=n-(int)(y/x)-1;
    }
    else
    {
    t=n-(int)(y/x);
    }
    if(t>0)
    cout<<t<<endl;
    else
    cout<<0<<endl;
    return 0;
}

016:简单计算器

#include <iostream>
using namespace std;
int main()
{
    int a,b;
    char ch;
    cin>>a>>b>>ch;
    if((ch=='+')||(ch=='-')||(ch=='*')||(ch=='/'))
    {
        switch (ch)
        {
            case '+':
                cout<<a+b<<endl;
                break;
            case '-':
                cout<<a-b<<endl;
                break;
            case '*':
                cout<<a*b<<endl;
                break;
            case '/':
            {
                if(b==0) cout<<"Divided by zero!"<<endl;
                else cout<<a/b<<endl;
            }
        }
    }
    else cout<<"Invalid operator!"<<endl;
    return 0;
}

017:求整数的和与均值

#include <stdio.h>
int main(int argc, char *argv[]) {
	int n=0,a=0,sum=0;
	scanf("%d",&n);
	int count=n;
	while(n!=0)
	{
		scanf("%d",&a);
		sum+=a;
		n--;
	}
	printf("%d %.5f",sum,(double)(sum)/count);
	return 0;
}

018:整数序列的元素最大跨度值

#include <stdio.h>
#include <math.h>
int main() {
	int m,n,max=0,min=100;
	int i,j;
	scanf("%d\n",&n);
	for(i=1;i<=n;i++)
    {
        scanf("%d ",&m);
        if(max<m)      //找出最大值
            max=m;
        if(min>m)      //找出最小值
            min=m;
    }
    j=max-min;
    printf("%d\n", j);
	return 0;
}

019:奥运奖牌计数

#include <stdio.h>
#include <stdlib.h>
int main()
{
     int i,n,a,b,c,d;
     a=0;b=0;c=0;
     scanf("%d",&n);
     int x[n-1];
     int y[n-1];
	 int z[n-1];

     for(i=0;i<n;i++)
     {
     	scanf("%d %d %d",&x[i],&y[i],&z[i]);
     	a=a+x[i];
     	b=b+y[i];
     	c=c+z[i];
     }
     d=a+b+c;
     printf("%d %d %d %d",a,b,c,d);
   return 0;
  
}

020:乘方计算

#include<stdio.h>
int main()
{
    int a,n,i,sum=1;
    scanf("%d %d",&a,&n);
    for(i=0;i<n;i++)
        sum=sum*a;
    printf("%d",sum);
    return 0;
}

021:鸡尾酒疗法

#include <cstdio>
int main()
{
    int n,a,b;
    float x,y;
    scanf("%d",&n);
    scanf("%d%d",&a,&b);
    x=(float)b/a;
    for(int i=2; i<=n; i++){
        scanf("%d%d",&a,&b);
        y=(float)b/a;
        if((y-x)>0.05){
            printf("better\n");
        }else{
            if((x-y)>0.05){
                printf("worse\n");
            }else{
                printf("same\n");
            }
        }
    }
    return 0;
}

022:角谷猜想

#include<stdio.h>
int main()
{
	
	unsigned long long i;//可能不够长 所以得长长整型无符号 
	scanf("%lld",&i);
	while(i!=1) 
	{
		if(i%2==0&&i>=0)//偶数 
		{
			printf("%lld/2=",i);//改为unsigned long long要注意同时修改修饰符
			i=i/2;
			printf("%lld\n",i);
		}
		else if(i%2!=0&&i>=0)//奇数 
		{
			printf("%lld*3+1=",i);
			i=i*3+1;
			printf("%lld\n",i);
		}
	}
	printf("End");
	return 0;
 } 

023:正常血压

#include <stdio.h>

int main()
{
	
	int g,a,b,c=0,d,r,m=0,n=0,h;
	double l,q,x,y,v;
	scanf("%d",&h);
	for(a=1;a<=h;a++){
	scanf("%d%d",&g,&r);
	if(g>=90&&g<=140&&r>=60&&r<=90){
		m++;
	}
	else {
		if(c<m)c=m;
		m=0;
	}
}
	if(c<m)c=m;
	printf("%d",c);

}

024:数字反转

#include <stdio.h>
int main() {
    int a, b=0 ;
    scanf("%d", &a);
    if (a == 0) { // a为0
        printf("0");
        return 0;
    }else if (a < 0) { // a为负数
        a = -a;
        printf("-");
    }
    while (b == 0) { // 去除末尾所有0
        b = a % 10;
        if (b == 0)
            a = a / 10;
    }
    while (a != 0) {
        b = a % 10;
        a = a / 10;
        printf("%d", b);
    }
}

025:求特殊自然数

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main(){
int a,b,c;
for(a=1;a<=6;a++){
for(b=0;b<=6;b++){ 
for(c=1;c<=6;c++){
      int k = a*49+b*7+c;
      int n = c*81+b*9+a;
      if(k==n)
           {
            printf("%d\n",k);
            printf("%d%d%d\n",a,b,c);
            printf("%d%d%d\n",c,b,a);
           }    
      }
}


}

    return 0;       
}

026:雇佣兵

#include<cstdio> 
int main()
  {
      
  
      int m, n, x;
      scanf("%d %d %d", &m, &n, &x);
  
     while(x > 0) {
         int t = m/n;//需要m/n个元素
         if(m % n)
            t++;
         if(x < t)
             break;
         x -= t;//x-=m/n
         t = m/n;
         n += t;//n+=m/n 
     }
 
     printf("%d\n", n);
 
     return 0;
 }

027:数字统计

#include <iostream>
using namespace std;
int main()
{
	// 0.定义变量及输入数据 
	int L,R,N=0,k;
	cin >> L >> R;
	// 1.循环处理从L到R的每个数字i 
	for (int i=L;i<=R;i++){
		// 2.循环处理数字k中的每一位,判断是否为2
		k = i;
		while (k > 0){
			if (k%10 == 2) N++;
			k = k / 10; // 判断数字k的下一位 
		} 
	} 
	// 3.输出结果 
	cout << N << endl;
	return 0;
}

028:与指定数字相同的数的个数

#include<stdio.h>
int main()
{
	int i,n,m,x;
	x=0;
	scanf("%d\n",&n);
	int a[n-1];
	for(i=0;i<n;i++)
	{
		scanf("%d ",&a[i]);
	}
	scanf("%d\n",&m);
	for(i=0;i<n;i++)
	{
		if(a[i]==m)
		{
			x++;
		}
		else{
			
		}
		
	}
	printf("%d",x);
	return 0;
} 

029:陶陶摘苹果

#include<stdio.h> //头文件 
int appleNum();
//主函数 
int main(void){
	printf("%d",appleNum());//调用函数 
	return 0;
}
int appleNum(){
	/*
		a:当做输入数据时的变量 max:存放陶陶伸手够到的最大高度
		num:记陶陶够到的苹果数 数组b存放十个数据 
	*/ 
	int i,a,max,num=0,b[10];
	char c;		//字符c用来接收回车字符 
	for(i=0;i<10;i++){
		scanf("%d",&a);	//输入数据 
		b[i]=a;		//把输入的数据存在数组b中 
		if( (c=getchar())=='\n' ){	//判断输入的是否是回车,若是回车则终止输入 
			break;
		}
	}
	scanf("%d",&a);		//再次输入数据 
	max=a+30;		//陶陶伸手够到的最大高度,此时需要加上凳子的长度 
	//下面for循环是用来判断陶陶能够到的苹果数 
	for(i=0;i<10;i++){
		if(max>=b[i]){
			num++;
		}
	}
	return num;	//返回陶陶够到的苹果数 
}

030:年龄与疾病

#include<stdio.h>
int main()
{
	int i, n,a = 0, b = 0, c = 0, d = 0, k;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &k);
		if (k <= 18 && k >= 0) a++;
		else if (k <= 35) b++;
		else if (k <= 60) c++;
		else if (k > 60) d++;
	}
	printf("%0.2lf%%\n%0.2lf%%\n%0.2lf%%\n%0.2lf%%\n", (double)a / n*100, (double)b / n * 100, (double)c / n * 100,(double)d / n * 100);
	return 0;
}

031:校门外的树

#include<stdio.h>
int main(){
	int L,M; //L路长,L+1是数目多少,M代表区域数目
	scanf("%d%d",&L,&M);
	int num[10000+1]; //0-10000 能容纳的最多的树木
	int i,j;
	for(i=0;i<10001;i++){
		num[i]=0;   //将所有数目标记为 0; 
	} 
	int start,end; //区域的 开始与结束 
	for(i=0;i<M;i++){
		scanf("%d%d",&start,&end);
		for(j=start;j<=end;j++){
			num[j]=1;   //如果是区域中的值 就标记为1 重复也不怕1=1不影响 
		}
	}
	int sum=0;//计算被标记的树 
	for(i=0;i<10001;i++){
		if(num[i]==1){
			sum = sum+1; 
		}
	}
	printf("%d",L+1-sum); //一共L+1棵树-被标记过的就是剩下的 
	return 0;
}

032:计算鞍点

#include <iostream>
using namespace std;
int main()
{
    int A[5][5], n=5, i, j;
    for (i=0; i<5; i++)
        for (j=0; j<5; j++)
            cin >> A[i][j];
    bool flag = 0;
    int row, col;
    for (row=0; row<n; row++)
    {
        col = 0;
        for (j=1; j<n; j++){//查找第row行最大值的列号
            if (A[row][j] > A[row][col])
                col = j;
        }
        flag = 1;
        for (i=0; i<n; i++){//查找第col列最小值的行号,确定A[row][col]是否为鞍点
            if (A[i][col] < A[row][col]){//A[row][col]不是鞍点
                flag = 0;
                break;
            }
        }
        if (flag) //A[row][col]是鞍点
            break;
    }
    if (flag)
        cout << row+1 << " " << col+1 << " " << A[row][col] << endl;
    else
        cout << "not found" << endl;
    return 0;
}

033:图像模糊处理

#include<iostream>
#include<cmath>
using namespace std;
int a[1001][1001];
double b[1001][1001];
int main() 
{
    int m,n;
 
    int i,j;
    
    cin>>n>>m;//输入图像行数、列数
    
    for(i=1;i<=n;i++)//输入每个像素点灰度
        for(j=1;j<=m;j++)
            cin>>a[i][j];
    
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(i==1||i==n||j==1||j==m)//边界灰度不变
                b[i][j]=a[i][j];
            else//内部按要求求平均
            	b[i][j]=round((a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1])/5.0);//按要求用round()四舍五入
        }
    }
    
     for(i=1;i<=n;i++)//输出模糊后的图像
    {
        for(j=1;j<=m;j++)
            cout<<b[i][j]<<" ";
		cout<<endl;
    }
    return 0;
}

034:矩阵转置

#include<stdio.h>
using namespace std;
int a[1001][1001];
int main()
{
int m,n,i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(i=1;i<=m;++i)
{
for(j=1;j<=n;++j)
printf("%d ",a[j][i]);
printf("\n");
}
return 0;
}

035:Pell数列

int pell[1000001],a[100000];//要开得足够大 
int main()
{
    int k,n,i,j;
    scanf("%d",&n);
    for(j=1;j<=n;j++)
    {
        scanf("%d",&k);
        pell[1]=1; 
        pell[2]=2;
        for(i=3;i<=k;i++)//从第三位开始模拟 
        {
            pell[i]=pell[i-2]+2*pell[i-1];//an=2*an-1+an-2 
            pell[i]%=32767;//每次都对这个数列中的数取余,防止过大 
        }
        a[j]=pell[k]; 
    }
    for(j=1;j<=n;j++)
    printf("%d\n",a[j]);
}

036:求最大公约数问题

#include <stdio.h>
 
int main()
{
    int n1, n2, i, gcd;
    scanf("%d %d", &n1, &n2);
 
    for(i=1; i <= n1 && i <= n2; ++i)
    {
        // 判断 i 是否为最大公约数
        if(n1%i==0 && n2%i==0)
            gcd = i;
    }
 
    printf("%d", gcd);
 
    return 0;
}

037:编程填空:第i位替换

#include <iostream>
using namespace std;

int bitManipulation1(int n, int m, int i) {
return ((m>>i)&1) == 1?  (n|(1<<i)) : (n&(~(1<<i))); 
}

int main() {
	int n, m, i, t;
	cin >> t;
	while (t--) { 
		cin >> n >> m >> i;
		cout << bitManipulation1(n, m, i) << endl;
	}
	return 0;
}

038:编程填空:第i位取反

#include <iostream>
using namespace std;

int bitManipulation2(int n, int i) {
return (1<<i)^n;
}

int main() {
	int t, n, i;
	cin >> t;
	while (t--) {
		cin >> n >> i;
		cout << bitManipulation2(n, i) << endl;
	}
	return 0;
}

039:编程填空:左边i位取反

#include <iostream>
using namespace std;

int bitManipulation3(int n, int i) {
return (-1 << (32 - i)) ^ n;
}

int main() {
	int t, n, i;
	cin >> t;
	while (t--) {
		cin >> n >> i;
		cout << bitManipulation3(n, i) << endl;
	}
	return 0;
}

040:统计数字字符个数

#include<stdio.h>
int main()
{
	char x;
	int i=0;
	while(scanf("%c",&x),x!='\n')//回车符作为输入结束的标志
	{
		if(x>='0'&&x<='9')
		{
			i++;//记录数字字符个数 
		}
	}
	printf("%d",i);
	return 0;
 }

041:找第一个只出现一次的字符

#include<cstdio>
#include<cstring>
using namespace std;
char ch[100000];
int s=0;
int main()
{
	scanf("%s",ch);
	for(int i=0;i<strlen(ch);i++)
	{
		s=0;  
		for(int j=0;j<strlen(ch);j++)
		{
			if(ch[i]==ch[j])
				s++;
		}		
		if(s==1)
		{
		printf("%c",ch[i]);
		return 0;
		}	
	}
	printf("no");
 } 

042:石头剪子布

#include <iostream> 
#include<cstring>
using namespace std;
int main()
{
	int n;
	char a[100][10],b[100][10];
	cin>>n;
	for (int i=0;i<n;i++)
	{
		cin>>a[i];
		cin>>b[i];	

	}
	for (int i=0;i<n;i++)
	{
		int l1=strlen(a[i]);
		int l2=strlen(b[i]);
		if (l1==l2)
		    cout<<"Tie"<<endl;
		else
		{
			if (l1==4)
			{
				if (l2==5)
				  cout<<"Player2"<<endl;
				else
				  cout<<"Player1"<<endl;
			}
			else if(l1==5)
			{
				if (l2==4)
				  cout<<"Player1"<<endl;
				else
				   cout<<"Player2"<<endl;
			}
			else
			{
				if (l2==4)
				  cout<<"Player2"<<endl;
				else
				  cout<<"Player1"<<endl;
			} 
	    }
	}
 return 0;
}

043:最长最短单词

#include <stdio.h>
#include <string.h>
#define N 20010
char s[N];
int main()
{
    int len,max_len=-1,min_len=101;
    int max_pos=-1,min_pos=-1;
    int i,count=0;

    gets(s);
    len=strlen(s);

    for(i=0; ;i++)
    {
        if(i==len || s[i]==' ' || s[i]==',')
        {
        	if(count > max_len)
        	{
        		max_len=count;
        		max_pos=i-count;
			}
			if(count!=0 && count < min_len)
        	{
        		min_len=count;
        		min_pos=i-count;
			}
			s[i]='\0';
			count=0;
			
			if(i==len)
				break;
		}
		else
		{
			count++;
		}
    }
	printf("%s\n",&s[max_pos]);
	printf("%s\n",&s[min_pos]);
	return 0;
}

044:密码翻译

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
	char a[81];
    int len;
	
	gets(a);
	
	len=strlen(a);
	
	for	(int i=0;i<len;i++)
	{
		if(((a[i]>='A')&&(a[i]<='Z'))||((a[i]>='a')&&(a[i]<='z')))
		{
			if((a[i]=='z')||(a[i]=='Z'))
	          a[i]=a[i]-25;
			else
			  a[i]=a[i]+1;
		}
	
	}
	
	for(int i=0;i<len;i++)
	   cout<<a[i];
	   
	return 0;   
}

045:指针练习:输出Hello

#include <iostream>
using namespace std;
int main() {
	char s[] = "Hello";  
	char * p;
	for(
p=s;*p!='\0';p++
)
		cout << * p ;
	return 0;
}

046:指针练习:输出Tesla

#include <iostream>
using namespace std;
void Print(const char * p1, const char * p2) 
{  
	for(
;p1<p2;p1++
) 	
		cout << * p1;
}
int main()  
{
	const char * s = "Tesla123";
	Print(s,s+5);
	cout << endl;
	Print(s,s+3);
	cout << endl;
	
	return 0;
}

047:指针练习:ForEach

#include <iostream>
using namespace std;

void ForEach(void * a, int width, int num,
void (*f)(void *)
)

{
	for(int i = 0;i < num; ++i) 
		f((char*)a+width*i);
}

void PrintSquare(void * p)
{
	int * q = (int*)p;
	int n = *q;
	cout << n * n << ",";
}
void PrintChar(void * p) {
	char * q = (char*)p;
	cout << *q << ",";
}
int main()
{
	int a[5] = {1,2,3,4,5};
	char s[] = "hello!";
	ForEach(a,sizeof(int),5,PrintSquare); 
	cout << endl;
	ForEach(s,sizeof(char),6,PrintChar);
	return 0;
}

048:指针练习:Memcpy之一

#include <iostream>
using namespace std;
void Memcpy(char * src,char * dest,int n)
{
 while(n--)//到0结束循环,这里的n指的是数组src的长度 
        *dest++ = *src++;
}
int Strlen(char * s)
{	
	int i;
	for( i = 0; s[i]; ++i);
	return i;
}
int main()  
{
	int a;
	char s1[30];
	char s2[30];
	int t;
	cin >> t;
	for(int i = 0;i < t; ++i) {
		cin >> a;
		int b = 99999999;
		Memcpy((char*)&a,(char *) &b,sizeof(int));
		cout << b << endl;
	}
	for(int i = 0;i < t; ++i) {
		cin >> s1;
		Memcpy(s1,s2,Strlen(s1)+1);
		cout << s2 << endl;
	}
	return 0;
}

049:指针练习:double

#include <iostream>
using namespace std;

void Double(int * p, int n)
{
	for(int i = 0;i < n; ++i)
		p[i] *= 2;
}


int main()
{
	int a[3][4] = { { 1,2,3,4},{5,6,7,8},
					{ 9,10,11,12 } };
	
	Double(
a[1], 6
);
	for(int i = 0;i < 3; ++i) {
		for(int j = 0; j < 4; ++j)
			cout << a[i][j] << ",";
		cout << endl; 
	}
	
	return 0;
}

050:指针练习:Memcpy之二

#include <iostream>
using namespace std;
void Memcpy( void * src, void * dest, int size)
{
 char *psrc=(char*)src;
 char *pdest=(char*)dest;
 
 for(int i=size-1;i>=0;i--){
  *(pdest+i)=*(psrc+i);
 } 
}

void Print(int * p,int size)
{
	for(int i = 0;i < size; ++i)
		cout << p[i] << ",";
	cout << endl;
}

int main()
{
	int a[10];
	int n;
	cin >> n;
	for(int i = 0;i < n; ++i)
		cin >> a[i];
	int b[10] = {0};
	Memcpy(a,b,sizeof(a));
	Print(b,n);
	
	int c[10] = {1,2,3,4,5,6,7,8,9,10};
	Memcpy(c,c+5,5*sizeof(int)); //将c的前一半拷贝到后一半 
	Print(c,10);

	char s[10] = "123456789";
	Memcpy(s+2,s+4,5); //将s[2]开始的5个字符拷贝到s[4]开始的地方 
	cout << s << endl;
	
	char s1[10] = "123456789";
	Memcpy(s1+5,s1+1,4); //将s1[5]开始的4个字符拷贝到s1[1]开始的地方 
	cout << s1 << endl;
	
	
	return 0;
}

051:指针练习:MyMax

#include <iostream>
using namespace std;
void * MyMax(void *p,int size,int n,int (*f)(void *,void *)){
	char * p1=(char *)p;
	for(int i=0;i<n;i++){
		if(f(p1,(char *)p+size*i)<0){
		p1=(char *)p+size*i;
	}
	}
	return p1;
	
}

int Compare1(void * n1,void * n2)
{
	int * p1 = (int * )n1;
	int * p2 = (int * )n2;
	return ((*p1)%10) - ((*p2)%10);
}
int Compare2(void * n1,void * n2)
{
	int * p1 = (int * )n1;
	int * p2 = (int * )n2;
	return *p1 - *p2;
}
#define eps 1e-6
int	Compare3(void * n1,void * n2)
{
	float * p1 = (float * )n1;
	float * p2 = (float * )n2;
	if( * p1 - * p2 > eps)
		return 1;
	else if(* p2 - * p1 > eps)
		return -1;
	else
		return 0; 
}

int main()
{
	int t;
	int a[10];
	float d[10];
	cin >> t;
	while(t--) {
		int n;
		cin >> n;
		for(int i = 0;i < n; ++i)
			cin >> a[i];
		for(int i = 0;i < n; ++i)
			cin >> d[i];
		int * p = (int *) MyMax(a,sizeof(int),n,Compare1);
		cout << * p << endl;
		p = (int *) MyMax(a,sizeof(int),n,Compare2);
		cout << * p << endl;
		float * pd = (float * )MyMax(d,sizeof(float),n,Compare3);
		cout << * pd << endl;
	}
	return 0;
}

052:指针练习:指向指针的指针

#include <iostream>
using namespace std;
int main()
{
	int x,y,z;
	x = 10;
	y = 20;
	z = 30;
	
	int * a[3]  = { &x, &y,&z};
	for(
int *(*p)=a;
p < a + 3; ++p) 
			cout<< * (*p) << endl;
	return 0;
	
}

053:指针练习:SwapMemory

#include <iostream>
using namespace std;
void SwapMemory(void * m1,void * m2, int size)
{
char p;
	char *q1=(char*)m1;
	char *q2=(char*)m2;
	for (int i=0;i<size;i++){
		p=*(q1+i);
		*(q1+i)=*(q2+i);
		*(q2+i)=p;
		m1=q1;
		m2=q2;
	} 

}

void PrintIntArray(int * a,int n)
{
	for(int i = 0;i < n; ++i)
		cout << a[i] << ",";
	cout << endl;
}

int main()
{
	int a[5] = {1,2,3,4,5};
	int b[5] = {10,20,30,40,50};
	SwapMemory(a,b,5 * sizeof(int));
	PrintIntArray(a,5);
	PrintIntArray(b,5);
	char s1[] = "12345";
	char s2[] = "abcde";
	SwapMemory(s1,s2,5);
	cout << s1 << endl;
	cout << s2 << endl;
	return 0;
}

054:成绩排序

#include<iostream>
#include<cstring>
using namespace std;
#define maxSize 21
struct student
{
    char name[maxSize];
    int score;
};
int main()
{
    struct student s[maxSize],temp;
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>s[i].name>>s[i].score;
    //冒泡排序  
    for(int i=0; i<n-1; i++){
        for(int j=0; j<n-i-1; j++){
            if(s[j].score<s[j+1].score){
                temp = s[j];
                s[j] = s[j+1];
                s[j+1] = temp;
            }
            if(s[j].score==s[j+1].score && strcmp(s[j].name,s[j+1].name)>0){
                temp = s[j];
                s[j] = s[j+1];
                s[j+1] = temp;
            }
        }
    }
    for(int i=0; i<n; i++)
        cout<<s[i].name<<" "<<s[i].score<<endl;
    return 0;
}

055:分数线划定

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define N 5000
 
struct a {
    int no, a;
} a[N];
 
int cmp(const void* p1, const void* p2)
{
    if((*(struct a*)p2).a == (*(struct a*)p1).a)
        return (*(struct a*)p2).no < (*(struct a*)p1).no;
    else
        return (*(struct a*)p2).a > (*(struct a*)p1).a;
}
 
int main(void)
{
    int n, m, i;
 
    scanf("%d%d", &n, &m);
 
    for(i=0; i<n; i++)
        scanf("%d%d", &a[i].no, &a[i].a);
 
    qsort(a, n, sizeof(struct a), cmp);
 
    m = floor(m * 1.5);
    for(i=m; i<n; i++)
        if(a[i].a == a[i-1].a)
            m++;
        else
            break;
 
    printf("%d %d\n", a[m - 1].a, m);
    for(i=0; i<m; i++)
        printf("%d %d\n", a[i].no, a[i].a);
 
    return 0;
}

056:病人排队

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    struct bingren
    {
        string id;   //记录id 
        int age;    //记录年龄 
        int que;    //记录登记先后顺序 
    }b[202];
    bingren t;
    int n,q=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>b[i].id>>b[i].age;
        q++;
        b[i].que=q;    //记录谁先输入 
    }

    for(int i=0;i<n-1;i++)   
        {
            for(int j=i+1;j<n;j++)
            {
                if(b[i].age>=60&&b[i].age<b[j].age)  //对年龄大于60岁的进行排序 
                {
                       t=b[i];
                       b[i]=b[j];
                       b[j]=t;
                 }
                 else if(b[i].age==b[j].age&&b[i].que>b[j].que)   //如果年龄相同,按登记先后顺序排序 
                    {
                        t=b[i];
                       b[i]=b[j];
                       b[j]=t;
                     } 
             }
         }
    for(int i=0;i<n;i++)   //先输入年龄大于60 
    {
        if(b[i].age>=60)
        {
            cout<<b[i].id<<endl;    
        }
    }
    for(int i=0;i<n;i++)   //后输入年龄小于60 
    {
        if(b[i].age<60)
        {
            cout<<b[i].id<<endl;    
        }
    }
    return 0;
}

057:mysort

#include <iostream>
using namespace std;
struct A {
	int nouse1;
	int nouse2;
	int n;
};
void mysort(void* a,int n,int width,int(*f)(const void* e1,const void* e2))
{
    for(int i=n-1;i>=0;--i)
        for(int j=0;j<i;++j)
        {
            char* aj=(char*)a+j*width;
            char* aj1=(char*)a+(j+1)*width;
            if(f(aj,aj1)>0)
            {
                for(int k=0;k<width;k++)
                {
                    char temp=aj[k];
                    aj[k]=aj1[k];
                    aj1[k]=temp;
                }
            }
        }
}

int MyCompare1( const void * e1,const void * e2) 
{
	int * p1 = (int * ) e1;
	int * p2 = (int * ) e2;
	return * p1 - * p2;
}
int MyCompare2( const void * e1,const void * e2) 
{
	int * p1 = (int * ) e1;
	int * p2 = (int * ) e2;
	if( (* p1 %10) - (* p2 % 10))
		return (* p1 %10) - (* p2 % 10);
	else
		return * p1 - * p2;
}
int MyCompare3( const void * e1,const void * e2) 
{
	A * p1 = (A*) e1;
	A * p2 = (A*) e2;
	return p1->n - p2->n;
}
int a[20];
A b[20];
int main ()
{	
	int n;
	while(cin >> n) {
		for(int i = 0;i < n; ++i) {
			cin >> a[i];
			b[i].n = a[i];
		}
		mysort(a,n,sizeof(int),MyCompare1);
		for(int i = 0;i < n; ++i) 
			cout << a[i] << "," ;
		cout << endl;
		mysort(a,n,sizeof(int),MyCompare2);
		for(int i = 0;i < n; ++i) 
			cout << a[i] << "," ;
		cout << endl;
		mysort(b,n,sizeof(A),MyCompare3);
		for(int i = 0;i < n; ++i) 
			cout << b[i].n << "," ;
		cout << endl;
	}
	return 0;
}

058:从字符串中取数

#include <iostream>
#include <iomanip>
using namespace std;
double GetDoubleFromString(char * str)
{
 static char *p=str;//**************静态本地变量的使用
 if(str)//******************静态本地变量的赋值
    p = str;
 while(*p&&!(*p>='0'&&*p<='9')){
  p++;
 }
 if(!*p){
  return -1;
 }
 double num=0;
 while(*p>='0'&&*p<='9'){
  num=num*10+*p-'0';
  p++;
 }
 if(*p=='.'){
  int i=10;
  p++;
  while(*p>='0'&&*p<='9'){
   num=num+(double)(*p-'0')/i;
   i*=10;
   p++;
  }
 }
 return num;

}

int main()
{
	char line[300];
	while(cin.getline(line,280)) {
		double n;
		n = GetDoubleFromString(line);
		while( n > 0) {
			cout << fixed << setprecision(6) << n << endl;
			n = GetDoubleFromString(NULL);
		}
	}
	return 0;
}

059:sort简单题

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

int main()
{
	int a[8] = {6,5,14,23,2,9,87,10 };
	sort(
a+1, a+7, greater<int>()
);
	for(int i = 0;i < 8; ++i)
		cout << a[i] << "," ; 
	return 0;
}

060:还是sort简单题

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

struct Point{
	int x;
	int y;
};
struct Rule1
{
    bool operator()(const int &a1,const int &a2)
    {
         if(a1%10<a2%10)
            return true;
         else if(a1%10==a2%10&&a1>a2)
            return true;
        else
            return false;
    }
};
 
struct Rule2
{
    bool operator()(const Point &a,const Point &b)
    {
 
        if(a.x*a.x+a.y*a.y==b.x*b.x+b.y*b.y)
        {
                if(a.x==b.x)
                    return a.y<b.y;
                else
                    return a.x<b.x;
        }
        else return a.x*a.x+a.y*a.y<b.x*b.x+b.y*b.y;
    }
};


int main()
{
	int a[8] = {6,5,55,23,3,9,87,10 };
	sort(a,a+8,Rule1());
	for(int i = 0;i < 8; ++i)
		cout << a[i] << "," ; 
	cout << endl;
	Point ps[8] = {{1,0},{0,1},{0,-1},{-1,0},{1,-1},{1,1},{2,0},{-2,0} } ;
	sort(ps,ps+8,Rule2());
	for(int i = 0;i < 8; ++i)
		cout << "(" << ps[i].x << "," << ps[i].y << ")"; 
	return 0;
}

061:Set

#include <iostream>
#include <set>
#include <string>
#include <iterator>

using namespace std;

int main()
{
    multiset<int> mset;
    set<int> mm;
    char commend[5];
    int i, n, num, amount;
    multiset<int>::iterator it;
    cin >> n;
    for (i = 0; i < n; i++)
    {
        cin >> commend >> num;
        switch (commend[1])
        {
        case 'd':
            mset.insert(num);
            mm.insert(num);
            cout << mset.count(num) << endl;
            break;
        case 'e':
            cout << mset.count(num) << endl;
            mset.erase(num);
            break;
        case 's':
            if (mm.find(num) == mm.end())
                cout << "0 0" << endl;
            else
            {
                cout << "1 ";
                cout << mset.count(num) << endl;
            }
            break;
        }
    }
    return 0;
}

062:热血格斗场

#include<bits/stdc++.h>
using namespace std;
map<int,int>c;
map<int,int>::iterator k;
int n,i,a,b,id,v;
bool ok;
int main(){
	scanf("%d",&n);
	c[1e9]=1;
	for(i=1;i<=n;i++){
		scanf("%d%d",&id,&v);
		k=c.upper_bound(v);
		if(k==c.end()){
			k--;
			ok=true;
		}
		a=k->first-v;
		b=k->second;
		if(k!=c.begin()&&ok==false){
			k--;
			if(v-k->first<=a)
				b=k->second;
		}
		printf("%d %d\n",id,b);
		c[v]=id;
	}
	return 0;
}

063:冷血格斗场

#include<iostream>
#include<map>
#include<cmath>
#include <cstdio>
using namespace std;

multimap<int,int> MEMBER;
multimap<int,int>::iterator i,a1,a2;

int n;
int id;
int power;
//有相同战斗力的,只保留id最小的那个就行了
 
int main(){
	scanf("%d",&n);
	MEMBER.insert(make_pair(1000000000,1));
	while(n--){
		scanf("%d%d",&id,&power);
		if(MEMBER.find(power)!=MEMBER.end()){       //如果有相同值 
			i=MEMBER.find(power);         //找到该值 

			if (id < i->second){        	  //新的id更小 
				printf("%d %d\n",id,i->second);    //输出 
				MEMBER.erase(i->first);                    //擦除老的 
				MEMBER.insert(make_pair(power,id)); //更新新的 

			}
			else 
				printf("%d %d\n",id,i->second);       //新的id更大,则直接输出比赛
		}
		
		//无相同值 
		else{
		i=MEMBER.insert(make_pair(power,id));    //插入 
		if(i==MEMBER.begin()){                    //插入的位置是头 
			printf("%d %d\n",id,(++i)->second);   //输出头的下一个 
		}
		else if(i==(--MEMBER.end())){                     //插入的位置是尾 
			printf("%d %d\n",id,(--i)->second);       //输出尾的上一个 
		}
		else{
			a1=--i;             
			++i;
			a2=++i;                
			if(abs(power-a1->first)<abs(power-a2->first)){  //a1距离更近 
				printf("%d %d\n",id,a1->second); 
			}
			else if(abs(power-a1->first)>abs(power-a2->first)){ //a2距离更近 
				printf("%d %d\n",id,a2->second); 
			}
			else{                        //距离相同 
				if(a1->second<a2->second)           //a1id更小       
					printf("%d %d\n",id,a1->second);
				else
					printf("%d %d\n",id,a2->second);  //a2id更小 
			}
		}
		MEMBER.insert(make_pair(power,id));       //入组 
	}
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值