入门模拟day3

问题 H: 部分A+B (15)

时间限制: 1 Sec   内存限制: 32 MB
提交: 261   解决: 214
[ 提交][ 状态][ 讨论版][命题人: 外部导入]

题目描述

正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。

现给定A、DA、B、DB,请编写程序计算PA + PB

输入

输入在一行中依次给出A、D A 、B、D B ,中间以空格分隔,其中0 < A, B < 10 10

输出

在一行中输出P A  + P B 的值。

样例输入

3862767 6 13530293 3
3862767 1 13530293 8

样例输出

399
0

#include <cstdio>
#include <string.h>
int main()
{
	long int a,da,b,db;
	while (scanf("%ld%ld%ld%ld",&a,&da,&b,&db)!=EOF)
	{
		char s1[10],s2[10];
		long int PA=0,PB=0;
		int k=1,j=1;
		sprintf(s1,"%ld",a);
		sprintf(s2,"%ld",b);
		for (int i=0;i<strlen(s1);i++)
		{
			if((s1[i]-'0')==da) 
			{
			PA+=da*k;k*=10;
		    }
	    } 
	    for (int i=0;i<strlen(s2);i++)
		{   if((s2[i]-'0')==db) 
			{
			PB+=db*j;j*=10;
		    }
		}
		printf("%ld\n",PA+PB);
	}
	return 0;
}

注意应为长整型 int为正负2*10^9

第一次把sprintf写成printf...

1026 程序运行时间(15)(15 分)

要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。同时还有一个常数CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数f的运行时间,我们只要在调用f之前先调用clock(),获得一个时钟打点数C1;在f执行完成后再调用clock(),获得另一个时钟打点数C2;两次获得的时钟打点数之差(C2-C1)就是f运行所消耗的时钟打点数,再除以常数CLK_TCK,就得到了以秒为单位的运行时间。

这里不妨简单假设常数CLK_TCK为100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。

输入格式:

输入在一行中顺序给出2个整数C1和C2。注意两次获得的时钟打点数肯定不相同,即C1 < C2,并且取值在[0, 10^7^]。

输出格式:

在一行中输出被测函数运行的时间。运行时间必须按照“hh:mm:ss”(即2位的“时:分:秒”)格式输出;不足1秒的时间四舍五入到秒。

输入样例:

123 4577973

输出样例:

12:42:59

#include <cstdio>
int main()
{
	int c1,c2;
	scanf("%d%d",&c1,&c2);
	int ans=c2-c1;
	ans=ans%100>=50? ans/100+1:ans/100;
    printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%3600%60);
	return 0;
} 

看了习题集上的指导

又把题目给看错了

c1 c2本来就是两次时钟打点数而不是测试scanf的运行时间

四舍五入部分用round牵扯浮点数计算比较复杂

注意时分秒输出保证不足两位时要补0补0补0补0补0!!!!

1046 划拳(15)(15 分)

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:

输入第一行先给出一个正整数N(<=100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中“喊”是喊出的数字,“划”是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:

在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

输入样例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

输出样例:

1 2

#include <cstdio>
int main()
{
	int n;
	scanf("%d",&n);
	int n1=0,n2=0;
	while(n--)
	{
		int a,b,c,d;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		if(b==(a+c)&&d!=(a+c))
		n2++;
		else if(d==(a+c)&&b!=(a+c))
		n1++;
	}
	printf("%d %d\n",n1,n2);
	
	
	
	return 0;
}

为什么不考虑到同赢的话不算分的情况呢!!!!

1008 数组元素循环右移问题 (20)(20 分)

一个数组A中存有N(N&gt0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A~0~ A~1~……A~N-1~)变换为(A~N-M~ …… A~N-1~ A~0~ A~1~……A~N-M-1~)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。

输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

#include <cstdio>
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int a[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int j=0;j<m;j++)
	{
		int temp=a[n-1];
		for(int i=n-2;i>=0;i--)
	        a[i+1]=a[i];
	    a[0]=temp;
	}
	for(int i=0;i<n-1;i++)
	printf("%d ",a[i]);
	printf("%d\n",a[n-1]);
	
	return 0;
}

书上直接按照顺序不同输出 5.2中提到更简单的数组方法 太难了...

1018 锤子剪刀布 (20)(20 分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第1行给出正整数N(<=10^5^),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出格式:

输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

5 3 2
2 3 5
B B

#include <cstdio>
int  test(char a)
{
	if(a=='B') return 0;
	if(a=='C') return 1;
	if (a=='J') return 2;
}
int main()
{
	int n,t1[3]={0},t2[3]={0},h1[3]={0},h2[3]={0};//胜平负次数,各种手势获胜次数 
	char b,c;
	char a[3]={'B','C','J'}; 
	int k1,k2;
	scanf("%d",&n);
	while(n--)
    {
       getchar();
       scanf("%c %c",&b,&c);
       k1=test(b);
       k2=test(c);
       if((k1+1)%3==k2){
       	t1[0]++;t2[2]++;
       	h1[k1]++;
       }
	   else if((k2+1)%3==k1){
       	t2[0]++;t1[2]++;
       	h2[k2]++;
       }
	   else 
	   {
	   	t1[1]++;t2[1]++; 
	   }
    }
	printf("%d %d %d\n",t1[0],t1[1],t1[2]);
	printf("%d %d %d\n",t2[0],t2[1],t2[2]);
	int i1=0,i2=0;
	for (int i=0;i<3;i++)
	{
		if(h1[i]>h1[i1])  i1=i;
		if(h2[i]>h2[i2])  i2=i;
	}
	    printf("%c %c\n",a[i1],a[i2]);
    
	return 0;
}

本来想定义一大堆变量小白做

发现书上真的写的很好

1.scanf使用%c换行符会有影响 加上getchar()

2.将字母改为数字更简单 正好满足字母序也满足胜负关系

3.用数组会更方便

4.甲乙胜负是成对出现的

5.刚开始时总习惯将输入n个数保存在数组中,现在学会仅仅控制次数,而每次只需将其放入数组 记录影响的结果即可

有点累 睡啦

猜你喜欢

转载自blog.csdn.net/coding18/article/details/80744372