宁大oj
诡计多端的 c
2469 熊抱
小朋友们在游乐场里玩耍,游乐场里有很多大大小的彩色圆形柱子,小朋友喜欢每个柱子都去熊抱一下。柱子呢有粗有细的,如果太粗了小朋友就无法完全将其抱住。现在告诉你10根柱子的半径,以及小朋友的臂展,那么有几根柱子小朋友可以完全抱的住呢?其中能抱住的柱子里面最粗的柱子又有多粗呢?注意:假设柱子的截面为一个正圆形,臂展不小于其周长才能将其完全抱住。
lnput
第1行一个整数,表示小朋友的臂展([1,700])。第2行10个整数,表示每根柱子的半径。(半径在[1,100]之间)
Output
输出2个整数A、B,以空格分隔。A表示小朋友能完全抱住的柱子有几根。B表示能抱住的柱子的最大半径,如果没柱子可抱则B为-1。
Sample Input
100
6 7 8 9 10 5 2 4 7 5
Sample Output
10 10
HINT
圆周率取3.14
解决方法:
#include<stdio.h>
#include<string.h>
int main(){
int shou,a[10],i,j,n,min,temp;
n=10;
scanf("%d",&shou);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
//先排序
for (i=0; i<n-1;i++) {
min=i; //p用于记录最小元素的下标
for (j=i + 1;j<n;j++) { //找到剩下元素中最小的那一个
if (a[min] > a[j])
min = j;
}
temp = a[i]; //temp是交换两数时的中间变量
a[i] = a[min];
a[min] = temp;
}
//再依次算周长
double pi=3.14;
double yuanz=0;
for(i=0;i<n;i++){
yuanz=pi*2*a[i];
if(yuanz>shou){
if(i==0)
printf("%d",-1);
printf("%d %d",i,a[i]);
return 0;
}
}
printf("%d %d",10,a[i-1]);
return 0;
}
1815 猜数字
猜数字游戏是 gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
Input
输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。在接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=O时,输入数据结束。
Output
每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure",输出不包含双引号。
枚举法-暴力解决
1、第一步:构建1个1000-9999的框架
2、此时第一个数为1000,就把他当作是猜对的数据
3、对input输入的数据逐行匹配,他给的数和我正确的数,他的猜对数和正确位置数应该一样,一行行检验,不满足,马上换一个数从头开始,!!!如果满足,也继续从头开始(我要保证我猜对的数是唯一的)
4、最后就输出结果
另外:检验猜对的数字的解决方法,是建立两个数组,对他每个数分别对两个数组对应空格++,再比较两个数组,(主要解决重复问题),相等就是不仅猜对数,还猜对个数,如果不等,我只能加最小的值,比如正确数是5555->4,我猜的数3555->3:1 5:3,只能猜对 3个5
ps:其实不难,他算水题😂😂😂
Sample Input
6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0
Sample Output
3585
Not sure
解决方法:
#include<stdio.h>
#include<string.h>
#include <math.h>
int match1(int num1,int num2);
int match2(int num1,int num2);
//我最喜欢暴力了,越暴力越好
//猜数字,枚举法,从1000-9999的所有四位数都遍历一遍,只要这个数满足所有要求,就是我的数
int main(){
int n;
while(scanf("%d",&n)&&n!=0){
int i,nnum,b=0,flag=0;
int num[n],dui1[n],dui2[n];//num表示数,d1表示猜对几个数,d2表位置正确的数
for(i=0;i<n;i++){
scanf("%d%d%d",&num[i],&dui1[i],&dui2[i]);
}
i=0;
for(nnum=1000;nnum<=9999;nnum++){
while(i<n){//对六条记录循环,一旦不匹配就跳出循环,枚举下一个数字
if(dui1[i]!=match1(nnum,num[i])){
i=0;
break;
}
if(dui2[i]!=match2(nnum,num[i])){
i=0;
break;
}
i++;
}
if(i==n){
if(flag==0){
flag=nnum;
}
b++;
i=0;
}
}
if(b>1)
printf("%s\n","Not sure");
else if(b==1)
printf("%d\n",flag);
}
return 0;
}
//用来判断有几个正确的数字,假设num1就是我们要找的数
int match1(int num1,int num2){
int n=0,i;
int num3[10],num4[10];
for(i=0;i<10;i++){
num3[i]=0;
num4[i]=0;
}
int a[4],b[4];
i=3;
while(num1>0){
a[i]=num1%10;
b[i]=num2%10;
num1=num1/10;
num2=num2/10;
i--;
}
for(i=0;i<4;i++){
num3[a[i]]=num3[a[i]]+1;
num4[b[i]]=num4[b[i]]+1;
}
for(i=0;i<10;i++){
if(num3[i]>0&&num4[i]>0){
if(num3[i]==num4[i]){
n=n+num3[i];
}else {
n=n+fmin(num3[i],num4[i]);
}
}
}
return n;
}
//用来判断在正确位子上的数字,假设num1就是我们要找的数
int match2(int num1,int num2){
int n=0,i;
int a[4],b[4];
i=3;
while(num1>0){
a[i]=num1%10;
b[i]=num2%10;
num1=num1/10;
num2=num2/10;
i--;
}
for(i=0;i<4;i++){
if(a[i]==b[i])
n++;
}
return n;
}
1510 26进制问题
给定一个十进制正整数,将其转化成26进制数输出,其中用A表示0,B表示1,... ,Z表示25。
Input
输入十进制正整数N(0<= N<= 1,000,000,000 ),并以-1为结束符。
Output
输出转换得到的26进制数。
Sample Input
26
676
-1
Sample Output
BA
BAA
解决方法:
#include<stdio.h>
int main(){
int n,i;
int a[10000];
//十进制转换为26进制->一直/26
while((scanf("%d",&n)&&n!=-1)){
i=0;
while(n>0){
a[i]=n%26;
n=n/26;
i++;
}
for(int j=i-1;j>=0;j--){
a[j]=a[j]+65;
printf("%c",a[j]);
}
printf("\n");
}
return 0;
}
1446 对称方阵I
观察以下所示的方阵的构造特点,总结归纳其构造规律,设计并输出如图中所示形式的n(奇数)阶对称方阵。
1234321
2234322
3334333
4444444
3334333
2234322
1234321
Input
输入一个正整数n (n≤25),且n为奇数。
Output
输出n阶的对称方阵。
Sample Input
5
Sample Output
1 2 3 2 1
2 2 3 2 2
3 3 3 3 3
2 2 3 2 2
1 2 3 2 1
解决方法:
因为输入的为奇数,如5->(5+1)/2=3,那么就将正方形分成4个部分,主要看左上部分
1、规律:
第一行从1开始,输出一个1
第二行从2开始,输出两个2
2、可以先做1-3行,下面的4-5行就直接对称上一半部分就行*
3、上半部分可以对半分,只要做出左半部分,右半部分就对称好了*
4、开始照常输出,但定义循环,第几行输出几个行号(跟行号有关,牢牢抓住行号),其他照旧根据 j 的值走就行。
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n+1][n+1];
int seq=(n+1)/2;
int num1=seq;
int i,j,num=1,fir;
//解决上一半
for(i=1;i<=num1;i++){//行
num=1;
seq=(n+1)/2;
j=1;
fir=i;
while(j<=n){
if(j==(seq+1)){//直接解决右边一半
a[i][j]=a[i][j-2*num];
seq++;
num++;
}else{
if(j<=i){//第一行从1开始 第二行从2开始连续两个2 第三行从3开始输出3个3,其他的照常根据j走
a[i][j]=fir;
}else{
a[i][j]=j;
}
}
j++;
}
}
//下一半直接根据上一半输出
num=1;
for(i=num1+1;i<=n;i++){
for(j=1;j<=n;j++){
a[i][j]=a[i-2*num][j];
}
num++;
}
//输出
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
1437 结构体的嵌套
做个简单的结构体嵌套吧。设计一个结构体,包含学生姓名、性别、出生日期。其中出生日期又包含年、月、日三部分信息。
lnput
输入学生姓名、性别、出生日期。
Output
输出学生姓名、性别、出生日期。
Sample Input
Susan Wang
f
1992 7 26
Sample Output
Susan Wang
f
1992 7 26
解决方法:
#include <stdio.h>
#include <string.h>
//结构体嵌套
struct point{
int year;
int month;
int day;
};
struct stu{
char name[1000];
char sex;
struct point y;
};
int main(){
struct stu a;
fgets(a.name,1000,stdin);
scanf("%c",&a.sex);
scanf("%d%d%d",&a.y.year,&a.y.month,&a.y.day);
printf("%s",a.name);
printf("%c\n",a.sex);
printf("%d %d %d\n",a.y.year,a.y.month,a.y.day);
}
1434 鸡、兔、鸟同笼
鸡兔同笼的问题你已经非常熟悉了,那么我们今天增加点难度吧。九头鸟(传说中的一种怪鸟,它有九个头,二只脚)、鸡和兔子关在一个笼子里,数数它们的头数正好是k,数数它们的脚数也正好是k。请计算其中九头鸟、鸡和兔子各有多少只?(九头鸟、鸡和兔子确保至少各有1只)
lnput
输入数据只包含一个整数k(k<=100),且保证有解。
Output
依次输出九头鸟、鸡和兔子的数目,以单个空格作间隔。如果有多种情况,则每种情况占据一行。九头鸟少的情况排前面。(“那九头鸟个数一样的情况哪个排前面呢?"“随你咯,看运气吧。”)
Sample Input
100
Sample Output
7 31 6
8 14 14
解决方法:
1、两层循环,直接定调数量,省的再想,虽然时间复杂度提升了,但更简单
2、注意k=numt2,而不是比较numt1=numt2(可能会有小数)
#include <stdio.h>
int main(){
//九头鸟 九个头,两只脚
//鸡 一个头,两只脚
//兔 一个头,两只脚
int k,i,j;//头,脚
int numt1=0,numt2=0;
scanf("%d",&k);
for(i=0;i<=k/9;i++){//假设九头鸟有i只
for(j=0;j<=k-9*i;j++){//假设鸡有j只
numt1=k-9*i-j;//头
numt2=2*i+j*2+4*numt1;//脚
if(k==numt2){
printf("%d %d %d\n",i,j,numt1);
}
}
}
return 0;
}
1432 三角图形输出
Description
输出下面的图形
Input
无
Output
输出正三角形
Sample Input
Sample Output
*
***
*****
解决方法:
我的母语是无语
#include<stdio.h>
void main(){
printf(" *\n");
printf(" ***\n");
printf("*****\n");
}
1429 OJ上的简单排名
Description
你是第一次参加这样的程序设计比赛吗?那你知道OJ上是怎样进行排名的吗?我把部分规则告诉你,你试着来做个简单的排名吧。
lnput
每个输入文件只包含一组数据。第一行输入一个整数N,表示有N个队参加了比赛;后面N行分别输入测试的用例,每个测试用例一行,内容分别为整数Ti、Si和Pi,Ti代表队伍的编号ID,每个队伍的编号都是1~N且各不相同,Si代表队伍解出的题数,Pi代表罚时。假设所有队伍解出的题数都是不相同的。(0<N≤100,0 ≤ Si ≤100,0 ≤ Pi ≤10000 )
Output
按解出题数从高到低的顺序输出队伍的编号ID,两两间以空格分隔,最后一个ID之后没有空格。
Sample Input
3
3 2 200
2 1 100
1 3 300
Sample Output
1 3 2
解决方法:
交换的话用结构体就快多了
结构体定义:
struct Team{
int Ti;
int Si;
int Pi;
};
struct Team temp;
struct Team team[100];
#include <stdio.h>
struct Team{
int Ti;
int Si;
int Pi;
};
int main(){
struct Team team[100];
int n,i,j,max;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d%d",&team[i].Ti,&team[i].Si,&team[i].Pi);
}
//排序
struct Team temp;
for (i=0; i<n-1;i++) {
max=i; //p用于记录最小元素的下标
for (j=i + 1;j<n;j++) { //找到剩下元素中最小的那一个
if (team[max].Si < team[j].Si )
max = j;
}
temp = team[i]; //temp是交换两数时的中间变量
team[i] = team[max];
team[max] = temp;
}
for(i=0;i<n-1;i++){
printf("%d ",team[i].Ti);
}
printf("%d\n",team[n-1].Ti);
return 0;
}
1420 “山寨”斐波那契数列
Description
这年头,什么东西都玩山寨,我们也来凑个热闹吧。菲波那契数列你当然是熟悉的,那么看一个“山寨"菲波那契数列吧,它的递推式如下:式中a和 b是常数。给定a、b和n,计算对应的F(n)的值。
Input
第一行输入测试用例的个数T;后面T行分别输入测试的用例,每个测试一行,内容分别为整数a、b和n。已知数据范围: a<=10,b<=10,n<=30。
Output
输出对应的F(n)的值,每个样例结果占据一行。
Sample Input
2
1 2 3
1 3 6
Sample Output
3
24
解决方法:
#include <stdio.h>
int Fac(int a,int b,int n);
int main(){
int n,i,a,b,c;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",Fac(a,b,c));
}
return 0;
}
int Fac(int a,int b,int n){
if(n==1){
return a;
}else if (n==2) {
return b;
}else if (n>2&&n%2==1) {
return Fac(a,b,n-1)+Fac(a,b,n-2);
}else if (n>2&&n%2==0) {
return Fac(a,b,n-1)+Fac(a,b,n-2)+Fac(a,b,n-3);
}
return 0;
}
1418 折叠方阵
n阶折叠方阵是指,从指定起始数开始的n^2个连续整数折叠为n行n列的数方阵,起始数置于方阵的左上角,然后从起始数开始递增,按顺时针方向层层折叠地排列为顺时针折叠方阵,按逆时针方向层层折叠地排列为逆时针折叠方阵。
Input
输入起始数a与阶数n以及整数1(表示输出顺时针折叠方阵)或2(表示输出逆时针折叠方阵)。
Output
输出对应的折叠方阵。每个数据用%4d控制输出格式。
Sample Input
10 4 1
Sample Output
10 11 14 19
13 12 15 20
18 17 16 21
25 24 23 22
解决方法:
#include <stdio.h>
int main(){
int num,n,seq,i,j;
scanf("%d%d%d",&num,&n,&seq);
int arr[n+1][n+1];
//init
arr[1][1] = num++;
//层数
if(seq==1){
//顺时针
for (i=2;i<=n;i++){
//完成向下走
for (j=1; j<=i;j++){
arr[j][i] = num++;
}
//向左走
for (j=i-1; j>=1; j--){
arr[i][j] = num++;
}
}
}else if(seq==2){
//逆时针
for (i=2;i<=n;i++){
//完成向右走
for (j=1; j<=i;j++){
arr[i][j] = num++;
}
//向上走
for (j=i-1; j>=1; j--){
arr[j][i] = num++;
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%4d",arr[i][j]);
}
printf("\n");
}
return 0;
}
1374小CC的成绩Ⅱ
上小学的小CC刚考完期末考试,拿到成绩的她想知道自己的成绩如何,你能帮帮她吗?
lnput
第一行输入N(1<N<100)个学生,第二行输入2--N+1个学生的姓名s (少于10个字符)、语文成绩c、数学成绩m、英语成绩e。
Output
分三行输出语文、数学、英语的平均分(结果保留两位小数)。
Sample Input
3
zhangsan 65 45 87
lisi 78 89 93
lkfhi 87 67 54
Sample Output
76.67
67.00
78.00
解决方法:
#include <stdio.h>
#include <string.h>
struct stu{
char s[10];
int c;
int m;
int e;
};
int main(){
struct stu person[100];
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",person[i].s);
scanf("%d%d%d",&person[i].c,&person[i].m,&person[i].e);
}
double sumc=0,summ=0,sume=0;
for(i=0;i<n;i++){
sumc=sumc+person[i].c;
summ=summ+person[i].m;
sume=sume+person[i].e;
}
printf("%.2f\n",sumc/3);
printf("%.2f\n",summ/3);
printf("%.2f\n",sume/3);
return 0;
}
1373CoCo的成绩I
Description
上小学的CoCo刚考完期末考试,拿到成绩的她想知道自己的成绩如何,你能帮帮她吗?
Input
第一行输入一个整数n表示有n个学生( 1<N<100);
第二行输入这n个学生的姓名(少于10个字符)、语文成绩、数学成绩、英语成绩。
Output
分两行输出总分最高和最低的学生名字和各项成绩(如有相同总分则输出第一次出现的学生)。
Sample Input
3
Tom 65 45 87
CoCo 78 89 93
Mark 87 67 54
Sample Output
CoCo 78 89 93
Tom 65 45 87
解决方法:
#include <stdio.h>
#include <string.h>
struct stu{
char s[10];
int c;
int m;
int e;
int grade;
};
int main(){
struct stu person[100];
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",person[i].s);
scanf("%d%d%d",&person[i].c,&person[i].m,&person[i].e);
person[i].grade=person[i].c+person[i].m+person[i].e;
}
int min;
struct stu temp;
for (i=0; i<n-1;i++) {
min=i; //p用于记录最小元素的下标
for (j=i + 1;j<n;j++) { //找到剩下元素中最小的那一个
if (person[min].grade > person[j].grade)
min = j;
}
temp = person[i]; //temp是交换两数时的中间变量
person[i] = person[min];
person[min] = temp;
}
printf("%s %d %d %d\n",person[n-1].s,person[n-1].c,person[n-1].m,person[n-1].e);
printf("%s %d %d %d\n",person[0].s,person[0].c,person[0].m,person[0].e);
return 0;
}
1372 考试之后
Description
又是一次期中考。考完之后肯定少不了成绩的排名。可是面对这么多的成绩,老师也觉得累。于是向熟悉编程的你求助。计入排名的考试只有语文数学跟英语三门。按照平均分从高到低输出。
Input
先输入一个整数n,表示有n个学生。(0<n<300)
接下来n行,每行有4个数据,分别代表学号,语文成绩,数学成绩,英语成绩。
Output
按照平均分从大到小输出这n个学生的语文成绩、数学成绩、英语成绩。平均分相同时,按照学号的升序来。
Sample Input
4
1023 88 75 65
1033 99 59 70
1187 77 82 83
1054 64 86 92
Sample Output
1054 64 86 92
1187 77 82 83
1023 88 75 65
1033 99 59 70
解决方法:
1318 唯一的最好
Description
我们经常听到:“唯一的总是最好的。"不知道是哪个名人说的(好像是我说的。。。暴扁中。。。)。假设现在有一堆宝物,有些品种的宝物数量有多个,物以稀为贵,多了就不稀奇了。你能找到数量只有一个的宝物吗?宝物用小写英文字母a-z表示,只有26种哦,亲。
Input
输入为一行字符串,全部由小写字母表示,长度不大于100。如"abcdea"表示宝物b、c、d、e各出现了1次,而宝物a出现了2次。
Output
输出只出现一次的那种宝物的对应字符,如果出现一次的字符有多个,那么输出首先出现的那个字符即可。如果没有只出现一次的字符,那么输出“NO only
character”。
Sample Input
abcdefggfdca
Sample Output
b
解决方法:
#include <stdio.h>
#include <string.h>
int main(){
char a[26];
int i,j;
for(i=0;i<26;i++){
a[i]=0;
}
char str[100];
scanf("%s",str);
int len =strlen(str);
for(i=0;i<len;i++){
j=str[i]-97;
a[j]=a[j]+1;
}
for(i=0;i<26;i++){
if(a[i]==1){
printf("%c",i+97);
break;
}
}
if(i==26)
printf("%s","NO only character");
return 0;
}
1262 无重复排序
输入一组整型数据,每个数据都大于0且小于100,输入遇0时结束。要求将输入的数排序,并去掉相同的数,将排序结果从小到大输出。
Input
输入只有一组数据,输入数据不超过20个。所有输入都在正确的范围内。
Output
输出数据一个一行
Sample Input
16 89 9 8 6 16 9 0
Sample Output
6
8
9
16
89
解决方法:
#include <stdio.h>
#include <string.h>
int main(){
int a,i=0,j;
int b[100];
while(scanf("%d",&b[i])&&b[i]!=0){
i++;
}
int n=i;
//排序
int min,temp;
for (i=0; i<n-1;i++) {
min=i; //p用于记录最小元素的下标
for (j=i + 1;j<n;j++) { //找到剩下元素中最小的那一个
if (b[min] > b[j])
min = j;
}
temp = b[i]; //temp是交换两数时的中间变量
b[i] = b[min];
b[min] = temp;
}
i=0;
//删除数据中的重复项
for(j=1;j<n;j++){
if(b[i]!=b[j]){
b[++i]=b[j];
}
}
n=i+1;
for (i=0; i<n;i++) {
printf("%d\n",b[i]);
}
return 0;
}
1254 数值交换
编写程序,输入一个正整数n(n在[1,10]之间),接着输入n个整数,然后将最小值与第一个数交换,最大值与最后一个数交换,再输出交换后的n个数。
Input
输入一个正整数n(n在[1,10]之间),接着输入n个整数。(假设这n个整数互不相同)
Output
输出交换后的n个数。每个数据后面都跟一个空格,一行输出完毕后换行。
Sample Input
6 19 87 3 -98 77 6
6 6 5 4 3 2 1
Sample Output
-98 6 3 19 77 87
1 5 4 3 2 6
解决方法:
一个个交换,不然真的很麻烦
#include <stdio.h>
int main(){
int n,i,min,max,temp;
int a[15];
while(scanf("%d",&n)&&n!=EOF){
min=0;
max=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[min]>a[i])
min=i;
}
temp =a[min];
a[min]=a[0];
a[0]=temp;
for(i=0;i<n;i++){
if(a[max]<a[i])
max=i;
}
temp=a[max];
a[max]=a[n-1];
a[n-1]=temp;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
1240 约瑟夫问题(2)
Description
模拟这个游戏。n个人围坐一圈,从第1个人开始数,沿顺时针方向数到m,最后数到的人被淘汰。然后接下去数,数到m,再淘汰一人。重复上述过程,直到剩下1人为止。剩下的这个人是获胜者。
Input
输入两个整数n和m。n<1000。Output
依次输出每次被淘汰的人的编号以及最后获胜者的编号。每个数字占据一行。
Sample Input
5 3
Sample Output
3
1
5
2
Win=4
解决方法:
经典杀人游戏
1、把他表示成数组,然后循环,1表示活着,0表示死了,然后定一个一个人数p1
2、当人还活着,p1++,p1==m杀了这个人,并且重置p1,人死了j++
3、因为数组是从1开始,那么每次循环,j=(j+1)%n可能为0,其实就是n
4、正常人就行
#include <math.h>
#include<stdio.h>
#include <math.h>
int main(){
int n,m,i;
scanf("%d%d",&n,&m);
int p[n+1];
for(i=1;i<=n;i++){
p[i]=1;//1表示人还活着
}
int num=n;//当前人数
int j=1,p1=1;//游标,人数
while(num>1){//还剩两人游戏也得继续
if(p[j]==1){//活着
if(p1==m){
p1=1;
p[j]=0;//死
printf("%d\n",j);
num--;//人数减减
}else{
p1++;
}
}
j=(j+1)%n;
if(j==0){
j=5;
}
}
for(j=1;j<=n;j++){
if(p[j]==1)
printf("Win=%d",j);
}
return 0;
}
1235 回流的时光
Description
紧追时尚的你,一定看过电影“波斯王子一时之刃”吧,是否对时光倒流的能力念念不忘?时之刃里的沙子流过沙漏时,时光就会倒流。现在假设时之刃里的沙子有不同的颜色,一粒红色沙子可以让时光回流4S(4秒),一粒黄色沙子可以回流3S,一粒白色沙子可以回流1s,其他颜色无效。请根据题目条件计算王子这次能回流的时光有几秒。
Input
输入共三行,每一行包含沙子的颜色(0、1、2分别表示红色、黄色、白色)和粒数。
output
输出回流时光的总秒数,输出后换行。
Input
0 100
1 10
2 1
Output
431
解决方法:
#include <stdio.h>
int backtime(int a,int b);
int main(){
int n[3],num[3];
int i;
int time=0;
for(i=0;i<3;i++){
scanf("%d %d",&n[i],&num[i]);
}
for(i=0;i<3;i++){
time=time+backtime(n[i],num[i]);
}
printf("%d",time);
return 0;
}
int backtime(int a,int b){
int time=0;
if(a==0)
time=4*b;
else if(a==1)
time =3*b;
else if(a==2)
time =b;
return time;
}
1233 勤劳的蚂蚁
有两只勤劳的蚂蚁在准备食物,为了自我激励一下,它们打算开展比赛,看谁在一段时间内准备的食物多一些。你能帮忙做个裁判吗,来统计一下哪只蚂蚁准备得更加多一些?
lnput
输入有若干行,每行2个数字,第一个整数表示蚂蚁(1表示1号蚂蚁,2表示2号蚂蚁,不会出现其他数字)。第二个整数表示该蚂蚁带回的食物数量,假设该数据都在合法范围内。当输入两个数字都为0(即00)时表示输入结束。
Output
输出拖回食物多的蚂蚁的编号和食物总数量。如果相同,输出“equal”(输出不包含双引号)。输出后换行。
Input
1 2
2 9
1 7
2 6
1 1
2 0
1 2
2 11
0 0
Sample Output
2 26
解决方法:
#include <stdio.h>
int main(){
int num,weight;
int weight1=0,weight2=0;
while(scanf("%d %d",&num,&weight)&&num!=0||weight!=0){
if(num==1)
weight1=weight1+weight;
else if(num==2)
weight2=weight2+weight;
}
if(weight2>weight1)
printf("%d %d",2,weight2);
else if(weight2<weight1)
printf("%d %d",1,weight1);
else if(weight2==weight1)
printf("%s","equal");
}
1232 石头剪刀布
Description
CoCo要和Tom玩石头剪刀布的游戏,规则是石头砸剪刀、剪刀剪布、布包石头。用手玩的话谁都会,没什么稀奇的,今天他们换个玩法,用数字代替手势来完成石头剪刀布的游戏。假设О表示石头,1表示剪刀,2表示布,每人在纸上写一个数字(数字范围局限于0、1、2),然后同时展示所写的数字,如果CoCo的数字胜出了则输出 Win,否则一律输出Lose。Input
输入两个数字(数字范围局限于0、1、2) 。Output
如果第一个数字胜出了则输出Win,否则一律输出Lose。输出后换行。
Sample Input
0 2
Sample Output
Lose
解决方法:
#include <stdio.h>
int main(){
//假设О表示石头,1表示剪刀,2表示布,
//0与1,0胜 0与2,2胜 1与2,1胜
int a,b;
int flag=0;
scanf("%d%d",&a,&b);
if(a==0){
if(b==0)
flag=1;
}
if(a==1){
if(b==2)
flag=1;
}
if(a==2)
if(b==0)
flag=1;
if(flag==1)
printf("%s","Win");
else
printf("%s","Lose");
}
1231 统计闰年(1)
Description
计算出从2000年开始X年(含2000和2000+X)之间的闰年并输出。lnput
输入整数x。
output
输出属于闰年的年份,每个年份一行,输出后换行。
闰年判定:可以被4整除,但不可以被100整除或者可以被400整除
a%40&&a%100!=0||a%4000
Sample Input
50
Sample Output
2000
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
解决方法:
#include <stdio.h>
int main(){
int x,i;
scanf("%d",&x);
for(i=2000;i<=2000+x;i++){
if(i%4==0&&i%100!=0||i%400==0){
printf("%d\n",i);
}
}
}
1222 表示成两个数的平方和
Description
输入一个正整数N,找出所有满足X2+Y2=N的正整数对X和Y。
lnput
输入一个正整数N。Output
输出这两个正整数X和Y,满足X2+Y2=N,输出时要求X<=Y。如果无解则不需要输出任何信息。
Sample Input
50
Sample Output
1 7
5 5
解决方法:
#include <stdio.h>
#include <math.h>
int main(){
int n;
scanf("%d",&n);
int x,y,sum;
for(x=0;x<=n;x++){//确定x
y=sqrt(n-pow(x,2));
sum=pow(x,2)+pow(y, 2);
if(x<=y&&sum==n){
printf("%d %d\n",x,y);
}
}
}
1220 火车托运费
Description
设乘坐火车托运行李时按下列式子收费应交费用
y=0(0<=x<=20)
y=(x-20)2(20<x<=
解决方法:40)
y=(x-40)5+40(x>40)
编写程序计算应交金额(元)。
lnput
输入行李的重量x(整数)。output
输出应交的金额。
Sample Input
40
Sample Output
40
解决方法:
#include <stdio.h>
#include <math.h>
int main(){
int x;
scanf("%d",&x);
int y=0;
if(x>=0&&x<=20)
y=0;
else if(x>20&&x<=40)
y=(x-20)*2;
else if(x>40)
y=(x-40)*5+40;
printf("%d",y);
}
1218 正方形还是圆形
编写包含分支结构的交互程序,首先从键盘读入一个浮点数 a,然后再读入一个小写字母(s或c),如果读入的字母是s,则计算并输出正方形面积;如果读入的字母是c,则计算并输出圆面积。
lnput
输入一个浮点数和一个小写字母(s或c),假设不会出现其他字母。数字和字母紧挨着输入,中间不要加空格。
Output
根据输入的字母为s或c,决定输出正方形面积或是圆面积,保留2位小数。
Sample Input
2s
Sample Output
4.00
#include <stdio.h>
#include <math.h>
int main(){
double a;
char b;
double sq;
scanf("%lf%c",&a,&b);
if(b=='s')
sq=a*a;
else if (b=='c')
sq=3.14*a*a;
printf("%.2f",sq);
}
1217 超时硬币处理机
Description
超市前放置了一个硬币处理机,可以帮你把零钱转换为存款单。在实际应用中,机器中将有相应装置自动识别并计算你的零钱的数目,但是我们现在只能先进行一个手工的小实验,由你自己输入每种硬币的数目,然后编写程序将其转换成存款单。
lnput
依次输入1元、5角、1角的零钱的个数。假如输入三个整数3 10 25,则表示有3个1元硬币、10个5角硬币和25个1角的硬币。
Output
输出存单金额,如对上例的输入,输出为
Dollars=10
Change=50
表示存单上的整数金额为10元,零钱金额为50分。
即要求Dollars后显示的是元的信息,Change后面显示的是分的信息。
Sample Input
3 0 10
Sample Output
Dollars=4
解决方法:
#include <stdio.h>
int main(){
int yuan,jiao1,jiao2;
scanf("%d%d%d",&yuan,&jiao1,&jiao2);
double sum=0;
sum=yuan+0.5*jiao1+0.1*jiao2;
sum=sum*100;
printf("Dollars=%d\nChanges=%d\n",(int)sum/100,(int)sum%100);
return 0;
}
1212 小于某数的整数和
Description
给定一个正整数a,以及另外的5个正整数,请问:这5个正整数中,小于a的整数的和是
多少?
lnput
先输入一个正整数a,再输入另外5个正整数。Output
计算这5个整数中,小于a的整数的和是多少,输出结果。
Sample Input
10 7 8 9 11 2
Sample Output
26
解决方法:
#include <stdio.h>
int main(){
int a,i;
int b[5];
int sum=0;
scanf("%d",&a);
for(i=0;i<5;i++){
scanf("%d",&b[i]);
if(a>b[i])
sum=sum+b[i];
}
printf("%d",sum);
return 0;
}
1211 还是鸡兔同笼
Description
一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。
lnput
第一行是测试数据的组数n,后面跟着n行输入。每组测试数据占一行,每行包含一个正整数a,代表笼子里面脚的总数。
Output
输出包含n行,每行对应一个输入,包含2个正整数,第一个是最少的动物数,第二个是最多的动物数。如果没有满足要求的答案,则输出两个0。
Sample Input
2
3
20
Sample Output
0 0
5 10
解决方法:
#include <stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int jiao;
int j,t,sum;
int min,max;
for(i=0;i<n;i++){
max=0;
j=0;
t=0;
sum=0;
scanf("%d",&jiao);//2*j+4*t=jiao
min=jiao;
for(j=0;j<=jiao/2;j++){//鸡数循环
t=(jiao-2*j)/4;
if((2*j+4*t)==jiao){
sum=j+t;//总数
}
if(min>sum)
min=sum;
if(max<sum)
max=sum;
}
printf("%d %d",min,max);
}
return 0;
}
1209 幂之和
Description
给定一个n位整数(n≥3 ),判断它的每个位上的数字的n次幂之和是否等于它本身。例如:3位数153(此时n=3),13+53+3^3=153
4位数8208(此时n=4),84+24+04+84=8208
Input
键盘输入一个整数x
output
若x符合条件则输出"Yes",否则输出“No”。输出不包含双引号。
Sample Input
92727
Sample Output
Yes
解决方法:
#include <stdio.h>
#include <math.h>
int lenInt(int a);
int main(){
int x,x1;
scanf("%d",&x);
x1=x;
int sum=0,a;
//对x1处理,再和x比较
int lend=lenInt(x);
while(x1>0){
a=x1%10;
sum=sum+pow(a,lend);
x1=x1/10;
}
if(sum==x)
printf("%s","Yes");
else
printf("%s","No");
return 0;
}
int lenInt(int a){
int len=0;
while(a>0){
len++;
a=a/10;
}
return len;
}
1208 简单算术运算
Description
输入一个数学表达式,输出运算结果。如输入为33,则输出结果27.00;如输入为7*8,则输出结果为56.00。(运算符号局限于+、-、*、l、五种,其余输出“Error”)
lnput
输入形式为a+( -、*、/、^)b,即一个数字、一个运算符号、再一个数字。如3+8。采用双精度类型
Output
输出运算结果,如11.00。保留⒉位小数
Sample lnput
3+8
Sample Output
11.00
解决方法:
#include <stdio.h>
#include <math.h>
double fun(int a,int b,char c);
int main(){
int a,b;
char c;
scanf("%d%c%d",&a,&c,&b);
printf("%.2f",fun(a,b,c));
return 0;
}
double fun(int a,int b,char c){
double result;
switch (c) {
case '+':
result=a+b;
break;
case '-':
result=a-b;
break;
case '*':
result=a*b;
break;
case '/':
result=(a*1.0)/b;
break;
case '^':
result=pow(a,b);
break;
}
return result;
}
1207 读了几页书
小玲读课外书,第一天读了x页,以后每天要比前一天多读m页,小玲共读了n天,问小玲共读了多少页?
Input
输入x、m和n。
Output
输出小玲n天共读了多少页
Sample lnput
12 6 7
Sample Output
210
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int x,m,n,i,sum;
scanf("%d%d%d",&x,&m,&n);
sum=x;//第一天
for(i=0;i<n-1;i++){
x=x+m;
sum=sum+x;
}
printf("%d",sum);
return 0;
}
1206 水费问题
为了加强居民的节水意识,某地区制定了以下生活用水收费标准:每户每月用水未超过7吨时,每吨收费1.0元,并加收0.2元每吨的城市污水处理费;用水若超过7吨(含7吨),则每吨收费1.5元,并加收0.4元每吨的城市污水处理费。输入用水量并计算应交水费。(注:非分段计费)
Input
用水量。(采用浮点类型)
Output
应交水费。(保留2位小数)
Sample Input
7
Sample Output
13.30
解决方法:
#include<stdio.h>
int main(){
int n;
double money=0;
scanf("%d",&n);
if(n<7){
money=1.0*n+0.2*n;
}else{
money=1.5*n+0.4*n;
}
printf("%.2f",money);
}
1205 梯形面积
Description
已知梯形上底和下底分别为x和y,高为h,求梯形面积。
Input
输入x、y和h。(双精度类型)
Output
输出梯形面积(保留2位小数)
Sample Input
10 20 5
Sample Output
75.00
解决方法:
#include<stdio.h>
int main(){
int x,y,h;
double s;
scanf("%d%d%d",&x,&y,&h);
s=((x+y)*1.0*h)/2;
printf("%.2f",s);
}
1200 求平均值
Description
输入10个实数,计算并输出所有大于o的元素的平均值(精确到小数点后2位)。
Input
输入10个实数。
Output
计算大于0的元素的平均值。
Sample Input
-5 2 -6 9 -4 -20 6 1 10
Sample Output
5.60
解决方法:
#include<stdio.h>
int main(){
int a,i,sum=0,n=0;
for(i=0;i<10;i++){
scanf("%d",&a);
if(a>0){
sum=sum+a;
n++;
}
}
printf("%.2f",sum*1.0/n);
}
1198 今天星期几
Description
输入一个正整数表示一个星期中的某一天,若此数字在[1,7]内,则输出对应英文星期名,否则表示输入错误,例如,输入2,程序输出"Tuesday",输入“16",程序输出“Illegal day”。
Input
输入一个正整数a表示星期几Output
这一天对应的英文星期名
Sample Input
2
Sample Output
Tuesday
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int a;
char *s;
scanf("%d",&a);
switch (a) {
case 1:
strcpy(s, "Monday");
break;
case 2:
strcpy(s, "Tuesday");
break;
case 3:
strcpy(s, "Wednesday");
break;
case 4:
strcpy(s, "Thursday");
break;
case 5:
strcpy(s, "Friday");
break;
case 6:
strcpy(s, "Saturday");
break;
case 7:
strcpy(s, "Sunday");
break;
default:
strcpy(s, "Illegal day");
}
printf("%s",s);
}
1194 一维数组中剔除0
给定一组数组,将其中的数字О去掉并且输出剩余的元素。
Input
第一行输入一个整数n代表数组长度(1<=n<=50)。
第二行输入这n个数。
Output
输出除О后的数组。
Sample lnput
5
1 5 0 6 0
Sample Output
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int n,a;
scanf("%d",&n);
int num[n];
int i,j=0;
for(i=0;i<n;i++){
scanf("%d",&a);
if(a!=0){
num[j]=a;
j++;
}
}
for(i=0;i<j;i++)
printf("%d ",num[i]);
}
1193 一维数组元素倒置
有一个长度为n数组,需要将数组中从指定位置m开始的k个元素倒放在原来的数组中。
lnput
第一行输入n,m,k(1<=n<=50)。
第二行输入数组中的n个数。
m代表元素的实际位置而不是在数组中的下标值。
Output
输出倒置后的数组。
Sample Input
13 3 11
1 2 3 4 5 6 7 8 9 10 11 12 13
Sample Output
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int n,m,k,i,j,temp;
scanf("%d%d%d",&n,&m,&k);
int num[n+1];
//m代表元素的实际位置而不是在数组中的下标值。
for(i=1;i<=n;i++){
scanf("%d",&num[i]);
}
j=m+k-1;//一个从前往后,一个从后往前,相遇即退出
for(i=m;i<=j;i++,j--){
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
for(i=1;i<=n;i++)
printf("%d ",num[i]);
}
1192 约瑟夫问题(1)
模拟这个游戏。有n个人围成一圈,从第一个人开始沿顺时针方向报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那个人?
Input
输入一个整数n。
Output
输出最后剩下的数。
Sample Input
5
Sample Output
4
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int n,i,j;
scanf("%d",&n);
int num[n+1];
for(i=1;i<=n;i++){
num[i]=1;//1表示人活着
}
j=1;
i=1;
int n1=n;//当前还活着的人数
while(n1>1){
if(num[i]==1){//这个人活着
if(j==3){
num[i]=0;
n1=n1-1;
j=1;
}else
j++;
}
i=i+1;
if(i%n!=0)
i=i%n;
}
for(i=1;i<=n;i++){
if(num[i]==1)
printf("%d",i);
}
}
1191 二维数组每行最大值
Description
求出二维数组每行的最大元素。Input
输入一个3*4的二维数组。Output
输出每行的最大值。各占一行。
Sample Input
1 3 5 7
2 6 9 2
11 4 6 5
Sample Output
7
9
11
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int n,i,j;
int num[4];
int max=-1000;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",&num[j]);
if(max<num[j])
max=num[j];
}
printf("%d\n",max);
}
}
1189 逆反的01串
CoCo处于青少年的叛逆时期,有时侯,表现出很强烈的逆反心理,你往东,她往西,你往南,她偏往北。这一次,不知道又是谁惹着她了,好端端的一个个01串,到了她的手里,都变成10串了。请你编个程序来模仿她的行为,将01串(长度≤200),全变成10串吧。
Input
输入一个01串。
Output
输出一个10串。即将输入内容中的О变1,1变0。
Sample Input
0110100100100
1000000010000000000
Sample Output
1001011011011
0111111101111111111
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
char str[100];
int i=0,len;
while(scanf("%s",str)){
len=strlen(str);
for(i=0;i<len;i++){
if(str[i]=='1')
str[i]='0';
else if(str[i]=='0')
str[i]='1';
}
printf("%s\n",str);
}
}
不准再做了,回顾