编程题#1:寻找下标
已知一个整数数组x[],其中的元素彼此都不相同。找出给定的数组中是否有一个元素满足x[i]=i的关系,数组下标从0开始。
举例而言,如果x[]={-2,-1,7,3,0,8},则x[3] = 3,因此3就是答案。
输入第一行包含一个整数n (0 < n < 100),表示数组中元素的个数。<br />第二行包含n个整数,依次表示数组中的元素。
输出为一个整数,即满足x[i]=i的元素,若有多个元素满足,输出第一个满足的元素。若没有元素满足,则输出“N”。
#include<iostream>
using namespace std;
int main()
{
int n=1;
int x[100]={0};
cin>>n;
for(int i=0;i<n;i++)
cin>>x[i];
for(i=0;i<n;i++)
{
if(x[i]==i)
{
cout<<i<<endl;
return 0;
}
}
cout<<"N"<<endl;
return 0;
}
编程题#2:四大湖
我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。
输入无。
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。
#include <iostream>
using namespace std;
int main()
{
int a, b, c, d;
a = b = c = d = 0;
for (int a = 1; a <= 4; a++) //鄱阳湖可能的排名
{
for (int b = 1; b <= 4; b++) //洞庭湖可能的排名
{
for (int c = 1;c <= 4; c++) //太湖可能的排名
{
for (int d= 1; d <= 4; d++) //洪泽湖可能的排名
{
//条件1:4个湖的大小均不相等
if ((a!=b && a!=c && a!=d && b!=c && b!=d && c!=d)
//条件2:4个人每人仅答对一个
&& ((b==1)+(d==4)+(a==3)==1 )
&& ((d==1)+(b==4)+(a==2)+(c==3)==1)
&& ((d==4)+(b==3)==1)
&& ((a==1)+(c==4)+(d==2)+(b==3)==1)
)
{
cout << a << endl << b << endl << c << endl << d << endl;
}
}
}
}
}
return 0;
}
编程题#3:发票统计
有一个小型的报账系统,它有如下功能:
(1)统计每个人所报发票的总钱数
(2)统计每类发票的总钱数
将此系统简化为如下:假设发票类别共有A、B、C三种;一共有三个人,ID分别为1、2、3。
输入系统输入包含三行,每行第一个数为人员ID(整型,1或2或3),第二个数为发票总张数(张数不超过100),之后是多个发票类别(字符型,A或B或C)和相应发票金额(单进度浮点型,不超过1000.0)。
输出包含六行,前三行为每人(按ID由小到大输出)所报发票总钱数(保留两位小数),后三行为每类发票的总钱数(保留两位小数)。
#include <iostream>
using namespace std;
int main()
{
int id=0;
int num=0;
char type='A';
float value=0;
float sum_id[3]={0};
float sum_type[3]={0};
int i=0;
for(int j=0;j<3;j++)//第一层循环是人员的循环;j是作为动态的id指针,进行人员循环
{
cin>>id>>num;
for(i=0;i<num;i++)//第二层循环是发票类型和金额的循环
{
cin>>type>>value;
if(type=='A')
sum_type[0]+=value;
if(type=='B')
sum_type[1]+=value;
if(type=='C')
sum_type[2]+=value;
sum_id[j]+=value;
}
}
for( i=0;i<3;i++)
cout<<sum_id[i]<<endl;
for(i=0;i<3;i++)
cout<<sum_type[i]<<endl;
return 0;
}
编程题#4:Tomorrow never knows?
甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。
读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。
输入仅一行,格式为yyyy-mm-dd的日期。
输出也仅一行,格式为yyyy-mm-dd的日期
网上答案
#include <stdio.h> //注意此头文件一定要写对,否则提交出错
int main()
{
int year=0,month=0,day=0;
scanf("%d-%d-%d", &year, &month, &day);
bool leapyear = (year % 4 == 0 && year % 100 != 0) || (year % 400 ==0);
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if (day == 31)
{
month++;
day = 1;
}
else
{
day++;
}
break;
case 12:
if (day == 31)
{
year++;
month = 1;
day = 1;
}
else
{
day++;
}
break;
case 2:
if (leapyear)
{
if (day == 29)
{
month ++;
day = 1;
}
else
{
day++;
}
}
else
{
if (day == 28)
{
month ++;
day = 1;
}
else
{
day++;
}
}
break;
case 4:
case 6:
case 9:
case 11:
if (day == 30)
{
month++;
day = 1;
}
else
{
day++;
}
break;
default:
break;
}
printf("%d-%02d-%02d\n", year, month, day);
return 0;
}
编程题#5:细菌实验分组
有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。
输入有多行,第一行为整数n(n≤100),表示有n个培养皿。
其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。
输出有多行:
第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。
然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。
#include<iostream>
using namespace std;
int main()
{
int n=0;
int x[100];
float y[100];
int id=0;
int before=0;
int after=0;
float result=0;
int flag=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>id>>before>>after;
result=after/before;
x[i]=id;
y[i]=result;
}
for(i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
if(y[i]>y[j])
{int change=y[i];
y[i]=y[j];
y[j]=change;
change=x[i];
x[i]=x[j];
x[j]=change;
}
}
int max=0;
for(i=0;i<n;i++)
{
float leap=y[i+1]-y[i];
if(max<leap)
{
max=leap;
flag=i;
}
}
cout<<"B:"<<(flag+1)<<endl;
for(i=0;i<flag+1;i++)
{
cout<<x[i]<<" "<<y[i]<<endl;
}
cout<<"A:"<<(n-flag-1)<<endl;
for(i=flag+1;i<n;i++)
{
cout<<x[i]<<" "<<y[i]<<endl;
}
return 0;
}
编程题#6:流感传染
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出第m天,得流感的人数
#include<iostream>
using namespace std;
int main()
{
int n=0;
int m=0;
char x[102][102];
cin>>n>>m;
int i=0;
int j=0;
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
cin>>x[i][j];
for(int d=0;d<m;d++)
{
for(i=1;i<n+1;i++)
{
for(j=1;j<n+1;j++)
{
if(x[i][j]=='@')
{
if(x[i-1][j]=='#') x[i-1][j]='@';
if(x[i+1][j]=='#') x[i+1][j]='@';
if(x[i][j-1]=='#') x[i][j-1]='@';
if(x[i][j+1]=='#') x[i][j+1]='@';
}
}
}
}
int sum=0;
for(i=1;i<n+1;i++)
{
for(j=1;j<n+1;j++)
{
if(x[i][j]=='@')
sum++;
}
}
cout<<m<<":"<<sum<<endl;
return 0;
}