问题 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。
输入
输出
样例输入
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>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移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个数保存在数组中,现在学会仅仅控制次数,而每次只需将其放入数组 记录影响的结果即可
有点累 睡啦