C语言基础

更新时间:2023-10-20 04:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一部分:枚举

在给定的范围内逐个检查是否符合条件。

例题zstu 3831

Description

输出所有形如aabb的四位完全平方数(即前2位数字相等,后2位数字相等,且是另外一个数的平方)

Input

没有输入

Output

按照从小到大输出4位完全平方数

枚举也是需要方法的,虽然可以从1000开始到9999逐个检查,但是这样效率不高,注意到四位数中只有两种数字,所以只需定义i,j两个变量即可。

代码: //zstu 3831

#include #include int main(){ int judge(int n);//定义判断n是否是完全平方数的函数 inti,j,first=0;//定义 first是为了不多输出空格,新OJ上这个很重要,在这道题上没关系,答案就一个 for(i=1;i<=9;i++) for(j=0;j<=9;j++){ int t=i*1100+j*11;//t就是符合第一个条件的数 if(judge(t)==1){

} } return 0; }

int judge(int n){ }

if(first!=0)printf(\printf(\first++;

int i=(int)sqrt(n);//(int)表示强制转换数据类型,在这里是舍去小数部分 if(i*i==n)return 1; return 0;

例2 zstu 4006

Description

求含有数字a且不能被a整除的4位整数的个数,并求这些整数的和

Input

多组测试数据,先输入整数T表示组数 然后每组输入1个整数a(1<=a<=9)

Output

对于每组测试数据输出一行,每行2个数分别是个数与和

Sample Input

1 3

Sample Output

思路类似上一题,但是稍麻烦点。这题应该需要从1000到9999进行查找,因为虽然有一个a了,但是含有几个a不确定,分开讨论更麻烦。

代码:

#include

int main(){

int judge(inta,int n);//定义判断函数,判断a是否是n中的一个数 intT,a,i;

scanf(\测试组数T while(T--) {

int sum=0,count=0;//初始化个数与和为0,避免累加上组的结果 scanf(\

for(i=1000;i<=9999;i++){

if(judge(a,i)==1&&i%a!=0){//满足两个条件 count++; sum+=i; } } printf(\ } return 0; }

int judge(inta,int n){ for(;n!=0;n/=10)//每次取n的个位数,之后将n除以10,即向右移一位 if(n==a)return 1;//函数在运行return语句之后就会结束,即使之后还有语句也不会执行 return 0; }

练习zstu 3512 3572 2429

第二部分数组(int,float,double等数字类的,char之后再说) 数组的操作一般分为排序,查找,删除。下面各取一道例题。 例1 排序 zstu 3540

Description

输入一个正整数N和N个整数,将它们按从大到小的顺序进行排序后输出。

Input

多组测试数据,每组输入一个正整数N(1≤N≤100)和N个整数,用空格分隔。

Output

将这N个数按从大到小的顺序重新输出。

Sample Input

10 -4 5 12 88 23 -9 2 0 8 10 5 12 3 4 9 -2

Sample Output

88 23 12 10 8 5 2 0 -4 -9 12 9 4 3 -2

下面给出两种方法 方法1:自定义函数 //zstu 3540

#include int main(){ void dsort(int* a,int n);//定义一个dsort函数,用于排序,参数为指向int型数据的指针和数组的大小(元素个数) intn,a[101],i; while(~scanf(\可以写scanf()!=EOF,这是另一种写法 for(i=0;i

void dsort(int *a,int n){//冒泡排序指针加上[k]可访问其本身地址之后的 k个元素 inti,j,t; for(i=0;i}方法二:利用C++库函数sort //zstu 3540

#include

#include //算法头文件

using namespace std;//使用std命名空间

boolcmp(inta,int b){//比较函数,如果不写的话,默认升序排序,并且调用函数的时候要这么写sort(a,a+n); return a>b;//这边的形态就是排完序之后前一个元素与后一个元素的大小关系 }

int main(){ intn,a[101],i; while(~scanf(\ for(i=0;i

例2,查找 Zstu 3883

Description

在给定的数组中查找一个数

Input

多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m

Output

查找在第一行的n个整数中第一次出现数字m的下标位置并输出,如果没有找到则输出No

Sample Input

3 4 5 6 5

4 2 2 2 2

2

Sample Output

1 0

代码: //zstu 3883

#include int main(){ intn,a[20],i,m; while(~scanf(\ for(i=0;i

例3 删除 Zstu 3884

Description

在给定的数组中删除一个数

Input

多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m

Output

删除在第一行的n个整数中第一次出现数字m并删除,然后按照顺序输出剩下的数,

Sample Input

4 1 2 3 4 3

Sample Output

1 2 4

Hint

m有可能在原数组中找不到,找不到则输出原数组

Source

思路应该比较简单,一次遍历即可,详情见代码。

代码: //zstu 3884

#include int main(){ intn,a[20],i,m; while(~scanf(\ for(i=0;i

for(i=0;i

for(j=i;j

a[j]=a[j+1]; break;//只需要找一个,找到跳出循环 }

int t=n-1;//表示最后一个元素的下标

if(i!=n)t--;//如果没找到的话,i=n,如果i!=n那么总元素减少1,即最后一个元素下标减1 for(i=0;i

练习zstu 3880 3881 3885 3886 3888 3892

第三部分字符串

关于字符串,我看到过很多人都不会,这边我会重点讲 由浅入深 2412

Description

鹦鹉越来越会说话了,你可以说一句话(最多不要超过80个字符哦),鹦鹉也能很快把你的话重复一遍。

Input

输入一行,中间可能有空格,回车表示说完了。

Output

输出也为一行,输出刚才输入的内容。

Sample Input

I am a student.

Sample Output

I am a student.

Hint

可能需要用到字符数组的知识,如果不清楚可以自学哦。

Source

本题是入门题,输入输出字符串的方法有两种: 假设有 char a[100];

1. 输入 scanf(“%s”,a);//读取字符串的时候一旦遇到空格就会结束,所有如果输入的字符串中含有空格就不能用这种方法输入。另外,这边的参数是首元素的地址,也就是数组名 输出printf(“%s”,a);//输出可以含有空格;

2. 输入 gets(a);//可以读取空格,但是遇到换行停止,参数也为数组名; 输出puts(a);//格式与gets()相同,注意输出后会自动输出换行

代码

//zstu2440

#include int main(){ char a[100]; while(gets(a)!=NULL){//读到文件末尾 puts(a); } return 0; }

Zstu 3545

Description

输入一个以回车结束的字符串(少于80个字符),将字符串的内容颠倒过来再输出

Input

多组测试数据,每组输入一个以回车结束的字符串(少于80个字符)。

Output

将这个字符串颠倒过来输出

Sample Input

ABC XYZ My god

Sample Output

ZYX CBA dogyM

Source

mgc1031

代码

//zstu3545

#include #include int main(){ char a[100]; while(gets(a)!=NULL){ //下面的strlen(a)是string.h头文件中的函数,返回字符个数 for(int i=strlen(a)-1;i>=0;i--)//不改变原字符串,输出字符的顺序相反 printf(\字符用%c,字符串用%s printf(\ } return 0; }

Zstu 3557

Description

有一行电文,请将电文中大写字母按A→Z,B→Y,C→X, D→W,……,X→C,Y→B,Z→A,的规律译成密文,其他字符保持不变。

Input

多组测试数据,每组输入一行以回车结束的字符串(少于80个字符)。

Output

输出加密后的字符串。

Sample Input

ABCDEFabcdefg?123 hello WORLD 890

Sample Output

ZYXWVUabcdefg?123 hello DLIOW 890

Source

JC-P140-8

这一题的重点在于asc码,就是说,一个整型数如果用%c输出会转化为相应的字符,这个数不能超过127

代码: //zstu3557

#include #include int main(){ char a[100],i; while(gets(a)!=NULL){ for(i=0;a[i]!='\\0';i++){//字符串以'\\0'结束 if(a[i]>='A'&&a[i]<='Z')//之前说过数组名加[i]访问第i个元素,这边也一样 printf(\查ascII表可以知道相互交换的两个字符代表的数字和都是155 elseprintf(\ } printf(\ } return 0;

}

Zstu 3561

Description

输入一字符串(少于80个字符),所谓“回文:是指顺读和倒读都一样的字符串,如“XYZYX”。若是回文,以输出“Yes”,否则“No”。

Input

多则测试数据,每组输入一字符串(少于80个字符)。

Output

若是回文,以输出“Yes”,否则输出“No”。

Sample Input

XYZYX

HOWAREYOU

Sample Output

Yes No

Source

讲下思路就好,首尾相同即可。

代码:

//zstu3557

#include

#include int main(){ char a[100]; int judge(char* a); while(gets(a)!=NULL){ if(judge(a)==1)printf(\ elseprintf(\ } return 0; }

int judge(char* a){ inti,j;

for(i=0,j=strlen(a)-1;i<=j;i++,j--)//定义首尾标志i=0,j=strlen(a)-1,从0开始,所以末位置是字符数-1 if(a[i]!=a[j])return 0; return 1; }

Zstu 3908

Description

英文单词,我们可以按照英语语法规则把单数变成复数。规则如下: (1)以辅音字母y结尾,则加es (2)以s,x,ch,sh结尾,则加es (3)以元音o结尾,则加es (4)其他情况加上s

Input

第一行输入一个数字n,表示有n组测试数据 后面跟n行,每行是一个英语单词

Output

对于每组测试数据,输出一行,要求将输入的英文单词变成复数

Sample Input

2 book fish

Sample Output

books fishes

Source

Yhr

简单题,根据规则,取最后两位,与规则比较即可。 代码:

//zstu 3908

#include #include int main(){ charstr[100]; int n; scanf(\ getchar(); while(n--){ gets(str); int c=strlen(str)-1,i; for(i=0;str[i]!='\\0';i++) printf(\ if(str[c]=='y'||str[c]=='o'||str[c]=='s'||str[c]=='x'||(str[c-1]=='s'&&str[c]=='h')||(str[c-1]=='c'&&str[c]=='h'))

printf(\ else printf(\ } return 0; }

zstu4041

Description

每年期末考试后的一周,是任课老师最忙的时候了。又要批卷子,又要应付来查分的同学。当然,今年不同了,一切将会变得轻松。考试可以在网上直接做了,批卷也将自动。对于查分,其实也不难。学了算法课程的你能帮老师写个查分的程序吗?

Input

多组测试数据,先输入一个整数T表示有T组测试数据

然后每组测试数据的第一行是2个整数N和M(N M均不大于100)分别表示这个班级有N个同学,其中M个同学来查分。 然后是N行,输入N个同学的学号和成绩,中间用空格隔开(其中学号是字符,成绩是整数)

然后是M行,每行输入一个同学的学号

Output

对于每组测试数据输出一行,内容是该同学的成绩

Sample Input

1 3 2

A110001 90 2011002 95 C030002 60 C030002 A110001

Sample Output

60 90

Source

Yehr

关于这道题事实上,能用很多方法来做,我会分别列举

//zstu4041 1. 两个数组

#include #include int main(){

intT,m,n,i,score[101];

char name[101][10],b[10]; scanf(\ while(T--) { scanf(\ for(i=1;i<=m;i++) scanf(\ for(i=1;i<=n;i++){ scanf(\ for(int k=1;k<=m;k++) if(strcmp(name[k],b)==0){//解释见方法2 printf(\ break; } } }

return 0; }

2. 结构体

#include #include typedefstruct{ /*

这是结构体的一种写法,typedef是重新命名一个数据类型本来按照教材定义应该是

struct list{ char name[10];

int score; };

然后引用的时候就用struct list a; 用这种方法就可以直接用list a; */

char name[10]; int score; }list;

int main(){ intT,m,n,i; char b[10]; list a[101];

scanf(\ while(T--) { scanf(\ for(i=1;i<=m;i++)

scanf(\注意结构体内部成员的赋值方法,当对内部成员赋值格式是与其本身的数据类型相同

for(i=1;i<=n;i++){ scanf(\ for(int k=1;k<=m;k++) if(strcmp(a[k].name,b)==0){//strcmp(a,b)是string.h头文件中的字符串比较函数,比较的方法是从第一个元素开始比较asc码,直到有一个元素不同,如果a[i]>b[i]返回1,a[i]>b[i]返回-1,全相等返回0

printf(\ break; } } }

return 0; }

3. C++ STL头文件map

#include #include

#include //注意没有.h using namespace std;//似曾相识吧 int main(){

intT,m,n,i,score;

char name[10],b[10]; scanf(\ while(T--) { mapa;//map是把两种数据类型结合形成一种累死数组的关系,<>中的前一个是关键词,也就是[]中的内容,后者是值 a是map的名称

scanf(\

for(i=1;i<=m;i++){ scanf(\ a[name]=score; } for(i=1;i<=n;i++){ scanf(\ printf(\这种方法节省了查找的步骤 } }

return 0;

} Zstu2485

Description

上大学了,朋友越来越多。很有必要建立一个通讯录以便需要时进行查询。 现在假设你已经建立了一个通讯录,通过输入姓名来查询他的详细信息。

Input

第1行是通讯录里的人员总数n

以下n行是每个人的信息,包括姓名,电话,email,通讯地址(通讯地址包括城市,街道,门牌号)各内容之间用空格隔开。 然后再输入1个数字m,表示需要查询的次数 随后是m行,每行输入一个人的姓名

Output

对于需要查询的姓名,输出他的详细信息,格式见例子

Sample Input

4

小王 13554678903 xiaowang@sohu.com 杭州 武林路 38号

张力 13554678503 zhangli@sohu.com 杭州 学林街 138号 王明 13554638903 wangming@sohu.com 杭州 武林路 28号

张雪 13554458503 zhangxue@sohu.com 杭州 学林街 138号 2 小王 张雪

Sample Output

小王 13554678903 xiaowang@sohu.com 杭州 武林路 38号 张雪 13554458503 zhangxue@sohu.com 杭州 学林街 138号

Source

Yhr

思路:类似于上一题,可采用结构体,所以注释就不写了,应该能看懂 这边我只提供结构体的写法

代码:

#include #include #include typedefstruct{ char name[15],phone[12],mail[20],city[10],road[10],num[10]; }list;

int main(){ list a[100]; intn,m,i; charna[10]; while(~scanf(\ for(i=0;i

练习3550 3549 3904 3906 3909 3596

第四部分指针与函数

这部分的内容上面都有讲到,也用过。

例题3573

Description

自定义函数is(number)判断number的各位数字立方和是否等于它本身,如is(121)返回值0,is(153)返回值1。

主函数输入两个正整数m和n(m>=1, n<=1000),输出m-n之间的所有满足各位数字和等于它本身的数。

Input

多组测试数据,每组输入两个正整数m和n(m>=1, n<=1000)。

Output

输出m-n之间的所有满足各位数字和等于它本身的数,\形式输出。

Sample Input

1 100 50 200 50 500

Sample Output

1 153

153 370 371 407

Source

这道题应该没有任何问题的吧,直接贴代码

wangyao

4049

Description

素月是什么,吃素的月?Oh,No!素月是素数月。下面我们定义素月。yyyy年MM月是素月当且仅当yyyyMM是素数的情况。

比如2000年03月组成的数字是200003,它是素数,所以2000年03月是素月。

2000年12月组成的数字是200012,它不是素数,所以2000年12月不是素月。

现在给你一个起始年月和终止年月,要你判断在起始年月与终止年月之间(包括起始年月和终止年月)有多少素月。

Input

多组测试数据,每一组数据一行,四个整数(ys,ms,ye,me),以空格分开,分别代表起始年,起始月,终止年,终止月。

数据保正起始年月在时间上是在终止年月之前或者相等的。 2000<=ys<=ye<2100, 1<=ms,me<=12,

数据处理到文件末尾。

Output

输出一个整数,占一行,代表起始年月与终止年月之间(包括起始年月和终止年月)素月的个数。

Sample Input

2000 1 2000 3 2000 12 2000 12 2000 1 2099 12

Sample Output

1

0 101

Source

CWW

感想 我以为我可以很快地搞定,没想到居然花了这么多时间。在过程中,我自己看到了自己当初很多的不足。即使是现在的我也不能保证做得很好。希望能对你有所帮助。有什么地方不懂就问我吧~~

//3573

#include int is(int n); int main(void){ intn,m; while(~scanf(\ inti,j; for(i=m;i<=n;i++) if(i==is(i)) printf(\ printf(\ } return 0; }

int is(int n) { int s=0,t; for(;n!=0;n=n/10){ t=n; s+=t*t*t; } return s; }

3577

Description

调用自定义后移函数move(int *a, int n, int m)来进行循环移位,对n(n<20)个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数,如下: n=10, m=3时:输入:1 2 3 4 5 6 7 8 9 10,输出:8 9 10 1 2 3 4 5 6 7

Input

输入多组测试数据,每组先输入n(n < 20)和m(m < n),再输入n个整数。

Output

输出循环移动m个数后的序列,数据间空格隔开。

Sample Input

10 4

1 2 3 4 5 6 7 8 9 10 7 2

1 2 3 4 5 6 7

Sample Output

7 8 9 10 1 2 3 4 5 6 6 7 1 2 3 4 5

Source

详情见代码,这题不难,就是要考虑好数组的重新赋值过程 #include

void move(int *a, int n, int m); int main(){ intn,m,i,a[20]; while(scanf(\ for(i=1;i<=n;i++) scanf(\ move(a,n,m); for(i=1;i

void move(int *a, int n, int m) { inti,j,c[20]; for(i=n-m+1,j=1;i<=n;i++,j++) c[j]=a[i];//将后m个数存到c数组中 for(j=m+1,i=1;j<=n;j++,i++) c[j]=a[i];//再将前n-m个元素存到c数组中,之后c就是要求的数组了 for(i=1;i<=n;i++)//c数组的值全部赋给a a[i]=c[i]; }

3584

Description

输入10个整数存储到数组a,再输入一个整数x,在数组a中查找x,若找到则输出相应的下标,否则显示\。要求定义和调用函数search(int list[], int n, int x),在数组list中查找元素x,若找到则返回相应下标,否则返回-1.

Input

多组测试数据,每组先输入10个整数,再输入一个x

Output

输出x在数组中的下标或\

Sample Input

1 2 3 4 5 6 7 8 9 10 5 1 2 3 4 5 6 7 8 9 10 20

Sample Output

4

Not found

Source

这道题目没什么好说的,就这样。 #include

int search(int a[], int n, int x);

//这边提一下,这个语句并不一定要放这个位置,只需要在第一次用到的地方之前就行 int main(void){ int a[10]i,t,x; while(~scanf(\ for(i=1;i<=9;i++) scanf(\

scanf(\ t=search(a,10,x); if(t==-1) printf(\ else printf(\ } return 0; }

int search(int a[], int n, int x) { int i; for(i=0;i

练习3586 3580 3579 3564 3568 3569

第五部分综合篇

如果你觉得,前面的题目都没问题了的话,就可以开始看下面的题目了。下面的题目总的来说,算C语言中不用算法的题目中比较难的题目了。

2473

Description

还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

Input

输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数。

Output

对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。

Sample Input

2 3

Sample Output

1 1 1 1 1 1 1 2 1

分析:杨辉三角的递推公式大家都知道,没什么好说的。 代码

#include #include int main(){ intn,a[31][31],i,j; memset(a,0,sizeof(a));//教给你一个函数,初始化数组a,使其每一个元素的值都为0,你可以不用,用for循环也可以 for(i=1;i<=30;i++) a[i][1]=1;//令第一列都为1 for(i=2;i<31;i++) for(j=2;j<31;j++) a[i][j]=a[i-1][j-1]+a[i-1][j];//递推式每个数都是它上面的那个数和它左边的数的和 while(scanf(\ for(i=1;i<=n;i++){//i为行号,j为列号 for(j=1;j

} printf(\ } return 0; }

2434

Description

输出双层金字塔。

Input

多个测试数据。每个测试数据输入一个整数n( 2 <= n <= 9)

Output

输出双层金字塔。

Sample Input

2 5

Sample Output

* *** * * *** ***** ******* ********* *******

***** *** *

Source

Yhr

分析:基本相同的题,就不讲了,直接代码。看了自己以前的代码,只能说,谁都有菜鸟的时候。。。各种凌乱,变量乱写,很多变量都是没用的。就像下面的代码,abck完全没必要去定义的吧,你能修改吗? 代码:

#include int main(){ int n; while(scanf(\ inti,j,k; for(i=1;i<=n;i++){ for(j=n-i-1;j>=0;j--) printf(\ for(k=1;k<=2*i-1;k++){ printf(\ if(k==2*i-1) printf(\ } } inta,b,c; for(a=n-1;a>=1;a--){ for(b=n-a-1;b>=0;b--) printf(\ for(c=1;c<=2*a-1;c++){ printf(\ if(c==2*a-1) printf(\ } } }

return 0; }

3535

Description

程序模拟简单运算器的工作:输入一个算式(没有空格),遇到?=?号说明输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。例如,输入“1+2*10-10/2\后结果为10。

Input

输入一个以等号结束的四则运算式(不含括号)

Output

输出计算结果

Sample Input

1+2*10-10/2= 1+3*5/2-7=

Sample Output

10 3

Source

分析:由于不考虑括号和计算的优先级,所以,就是读一数,读一个字符,进行操作,用选择结构来对就过进行操作。

#include int main(){ char op; int result, tmp; while(~scanf(\

while(1){//while(1)表示一直循环,因为1代表非0,也就是true op=getchar();//之前有个getchar()忘记讲了,是这样的,getchar()是读取一个字符,有时用于去掉读取数字之后的回车,以免是下面读取字符串的过程错误 if (op=='=') break; scanf(\ switch(op){//好久没写switch了不太熟悉 case '+': result+=tmp;break; case '-': result-=tmp;break; case '*': result*=tmp;break; case '/': result/=tmp;break; default: printf(\ } } printf(\ } return 0; }

Zstu3564

Description

N个人围坐一圈,编号分别为1~N。从编号为1的人开始,传递一只烫手的土豆。在经过M次传递之后,持有土豆的人将离开,而将土豆交给他的下一个人。然后,游戏重新开始。又经过了M 次传递之后,又将有一个人离开这个环,它同样将土豆交给他的下一个人。如此循环,直至最后剩下一个人为止,这个人就是最后的胜者。

Input

多组测试数据,每组输入总人数N(N≤80)和传递次数M(M≤N)。

Output

Sample Input

10 3 10 4

Sample Output

5 3

分析:可以定义一个数组a,都赋值为1,然后去一个t=0进行模拟,一旦a[i]轮到那个数,就令a[i]=0,之后在a[i]等于1的数中循环,模拟整个过程。

#include int main(void){ int a[100]; intn,m; while(scanf(\ inti,j,count=0;//i是人的编号,j是当前报的数,count是除掉的人数 for(i=1;i<=n;i++) a[i]=1; for(i=1,j=0;;i++){ if(a[i]!=0){ j++; if(j==m+1){//传递m次,就是从1开始点到m+1的出局 j=0;//计数又要重头开始 count++; a[i]=0; } } if(count==n){ printf(\剩下最后一个人,输出 break; } if(i==n)i=0;//点到最后一个人了,回到开头,别忘记每次循环i+1,所以是0 } } return 0; } 3587

结构体:计算输入日期是该年的第几天

Time Limit:1000MS Memory Limit:65536K Total Submit:2561 Accepted:1348

Description

定义一个结构体变量(包括年、月、日),输入一个日期,计算并输出该日是本年中的第几天.

Input

多组测试数据,每组输入年-月-日

Output

输出其在该年中对应的天数

Sample Input

2006-10-1

Sample Output

274

Source

没什么好讲的。 #include

int run(int n);//判断是否是闰年 typedefstruct{ intyear,month,day; }date; date t;

int main(void) { int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年 while(scanf(\ { inti,sum=0; if(run(t.year)==0)

for(i=0;i

int run(int n) { if(n0==0){ if(n@0==0) return 0; else return 1; } if(n%4==0) return 0; return 1; }

3590

Description

定义一个学生结构体,含学号(一维字符数组)、姓名、成绩(整型)。从键盘输入n(n<20),再输入n个学生的信息,按学生成绩从小到大顺序输出学生信息。

Input

多组测试数据,每组输入一个n,接着输入n个学生的信息。

Output

按成绩从小到大顺序输出学生信息。

Sample Input

4 1001 Li 76 1002 Zhang 92 1003 Liu 85 1004 Wang 70

Sample Output

1004 Wang 70 1001 Li 76 1003 Liu 85 1002 Zhang 92

Source

两种方法 1. 冒泡排序版

#include int main(void) { typedefstruct{char a[80];char b[80];int s;}grade; int n; while(scanf(\ { gradestr[n+1],str2; inti,j; for(i=1;i<=n;i++) scanf(\ for(i=1;i

} 2.

for(j=i;j<=n;j++) if(str[i].s>str[j].s){ str2=str[i]; str[i]=str[j]; str[j]=str2; } for(i=1;i<=n;i++) printf(\}

return 0;

Sort函数

#include #include using namespace std; typedefstruct{ char a[20],b[20]; int s; }grade;

boolcmp(grade a,grade b){ returna.s

int main(void) {

int n;

gradestr[25],str2;

while(scanf(\ { inti,j; for(i=1;i<=n;i++) scanf(\ sort(str+1,str+n+1,cmp); for(i=1;i<=n;i++) printf(\ }

return 0; }

4016

Description

一个猴子在一座不超过30级的小山上爬山跳跃,猴子上山一步可跳1级或跳3级,试求上山有多少种不同的爬法

Input

多组测试数据,每组输入1个整数n,表示山的台阶数

Output

对于输入的整数n求出多少种爬法

Sample Input

30

Sample Output

58425

Source

分析:类似与铺瓷砖用f[i]代表到i米高的地方的走法总数,那么考虑到之前的位置只能在i-1和i-3,根据加法原理,f[i]=f[i-1]+f[i-2];初始状态f[1]=1;f[2]=1;f[3]=2; 代码:

#include int main(){ intn,a[31]; a[1]=1;a[2]=1;a[3]=2; for(int i=4;i<=30;i++) a[i]=a[i-1]+a[i-3]; while(~scanf(\ printf(\ } return 0; }

4022

Description

把1到n2的正整数从左上角开始由外层至中心按照顺时针方向螺旋排列

Input

输入整数n (1 <= n <= 10)

Output

按示例输出矩阵

Sample Input

3 4

Sample Output

1 2 3 8 9 4 7 6 5

1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7

Source

如果我不写注释你能看懂吗? 代码:

#include int main(void){ intn,i,j,a[10][10]={0}; while(~scanf(\ int count=1,d=0;//d表示圈数

for(;d<=n/2;){ }

if(n%2==1&&d==n/2){//跳出的条件,n为奇数和偶数的时候是不同的 a[d][d]=count++; break; }

//注意i,j的变化,你能学到很多 for(i=j=d;i=d;i--)//下 a[i][j-1]=count++; for(j=j-2;j>d;j--)//左 a[i+1][j]=count++; d++;

//注意输出格式 if(n<=3){ for(i=0;i

else if(n<=9){ for(i=0;i

} } } return 0; }

4043

printf(\

Description

期末考试后,感觉成绩不错,小明和小王想出去庆祝一下。他们决定掷骰子决定

谁请客。小明和小王各报1个数字(数字是2到12中的一个),如果掷出来的2个骰子点数和是谁报的数字,那么谁就不用请客了。现在的问题是当小明和小王报出数字后,聪明的你能判断他们谁请客的可能性比较大?

Input

多组测试数据,先输入一个整数T表示组数

每组输入2个正整数(2到12之间)分别表示小明和小王报出数字

Output

对于每组测试数据,输出谁请客可能性比较大,如果是小明输出Xiaoming如果是小王输出Xiaowang,可能性一样大输出AA

Sample Input

1 8 7

Sample Output

Xiaoming

Hint

提示:

将两枚骰子的点数和分别为7与8的各种情况都列举出来,就可得到问题的结论。用a+b表示第一枚骰子的点数为a,第二枚骰子的点数是b的情况。

出现7的情况共有6种,它们是:

1+6,2+5,3+4,4+3,5+2,6+1。

出现8的情况共有5种,它们是:

2+6,3+5,4+4,5+3,6+2。

所以,小明获胜的可能性大。

Source

yehr

求出现掷出数的组合情况数

#include int main(void) { intT,m,n,a[13],t=1; for(int i=2;i<=7;i++,t++) a[i]=a[14-i]=t; scanf(\ for(int i=1;i<=T;i++) { scanf(\ if(a[m]>a[n])printf(\ if(a[m]==a[n])printf(\ if(a[m]

4001

Description

由n个1组成的整数能被K(K<10000)整除,n至少为多少?

Input

多组测试数据,第一行输入整数T,表示组数 然后是T行,每行输入1个整数代表K

Output

对于每组测试数据输出1行,值为n

Sample Input

1 11

Sample Output

2

Source

#include int main(){ inti,k,t,T; scanf(\ while(T--){ scanf(\ for(i=1,t=1;;i=i*10+1,t++){ i=i%k;//这条是精华,i*10+1和i%k*10+1对k是同余。这句使得i永远不会很大,避免溢出 if(i==0)break; } printf(\ } return 0; }

Zstu 2440

Description

在漆黑的夜里,n位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,他们一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,每人所需要的时间分别是a1、a2、...an分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这些人尽快过桥。

Input

输入分2行

第一行是一个整数n(1<=n<=1000)

第二行是n个整数,分别表示这n个人单独过桥需要的时间

Output

输出一行,他们过桥需要的总时间

Sample Input

5

1 3 6 8 12

Sample Output

29

Source

yhr

分析: 刚看到这道题目是是不是觉得很简单呢?其实它并不简单。

这是一个规模比较大的问题,一般来说,我们解决这类问题都会把它归纳为一个个的子问题,进而递推求解。还记得,母牛的那道题目吗?就是这样的。

这个问题同样如此。从比较小的规模来考虑。每次送过两个人,每次的最小时间必然产生在两种情况中:

1.最快的人依次带着剩余最慢的两个一次过桥,用时为a[i]+a[1]+a[i-1]+a[1],就是说最快的带其中一个先过去,最快的回来,再带下一个过去,再回来;

2.最快的两个人依次带最慢的两个过桥,用时为a[2]+a[1]+a[i]+a[2].也就是说,最快的两个先过桥,其中一个回来,最慢两个过去,剩余的那个回来。

这是在总人数大于等于4的时候才能用,1到3是特殊情况;

另外说一下,我们学校的OJ上数据是错的,它只考虑了第二种情况,所以你只考虑2 的话,就能AC。我这边给出的是正解。交到OJ是WA。

#include #include using namespace std; int main(void){ intn,a[120],i; while(~scanf(\ int sum=0; for(i=1;i<=n;i++) scanf(\ }

sort(a+1,a+n+1);//令用时升序,即速度递减 if(n==1)printf(\ else if(n==2)printf(\ else if(n==3)printf(\,2,3是特殊情况,直接出答案 else{//详情见分析 if(n%2==0){ for(i=n;i>=4;i-=2) sum+=min(2*a[1]+a[i]+a[i-1],a[1]+2*a[2]+a[i]); printf(\ } else{ for(i=n;i>=5;i-=2) sum+=min(2*a[1]+a[i]+a[i-1],a[1]+2*a[2]+a[i]); printf(\ } } }

return 0;

Hdu 1004(杭电的OJ acm.hdu.edu.cn) Problem Description

Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges' favorite time is guessing the most popular problem. When the contest is over, they will count the balloons of each color and find the result.

This year, they decide to leave this lovely job to you.

Input

Input contains multiple test cases. Each test case starts with a number N (0 < N <= 1000) -- the total number of balloons distributed. The next N lines contain one color each. The color of a balloon is a string of up to 15 lower-case letters.

A test case with N = 0 terminates the input and this test case is not to be processed.

Output

For each case, print the color of balloon for the most popular problem on a single line. It is guaranteed that there is a unique solution for each test case.

Sample Input

5

green red blue red red 3 pink orange pink 0

Sample Output

red pink

Author

WU, Jiazhi

Source

ZJCPC2004

Recommend

JGShining

分析:这道题是我们上学期的期末考试最后一题,其实难度不大,就是输出出现次数最多的元素。详见代码

# include # include int main(void) {

char a[1003][20]; intn,b[1003];

while(scanf(\ {

memset(b,0,sizeof(b));//初始化计数用的b数组 for(int i=1;i<=n;i++) scanf(\

for(int j=1;j

int max=b[1],t=1; for(int i=2;i<=n;i++)

if(b[i]>max){max=b[i],t=i;}//用t记录最大元素的下标 printf(\ } return 0; }

如果以上的题目你都能够弄清楚,能够靠自己做出来的话,你考试绝对不会差。下面有两道练习题,试试能不能做出来。加油!

4050

Description

Recently Brother.R has designed a BBS. Everyday there are many people register or login or logout.You are asked to help deal with these requests.There are three different requests, \

\\

%user or password!\login many times.

%user is on-line.

Every string will only contain lower-case letter or digit, and the range of its length is [1, 10].

Initially there is no user.

Input

The first line is integer N(N <= 20), the number of test requests. Then N lines, each line is one of three formats below:

register str1 str2 (str1 is the username and str2 is the password). login str1 str2 (str1 is the username and str2 is the password). logout str1 (str1 is the username).

Output

For each request, print the corresponding reply.

Sample Input

3

registerqige 123456 loginqige 123456 logoutqige

Sample Output

Congratulations, qige! Welcome qige! Goodbye qige!

Source

本文来源:https://www.bwwdw.com/article/pjbf.html

Top