C语言基础

更新时间:2024-04-27 05:44: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

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

//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; }

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

Top