C语言程序设计Ⅰ

#include <stdio.h>           //利用指针进行排序  
#include<math.h>

int main()
{ 
  int m,n,p,i,j;
  int a[106];
  int *t,k;
  
  scanf("%d %d",&m,&n);
  
  for(p=0;p<m;p++)
  {
    for(i=0;i<n;i++)
    {
      scanf("%d",t+i);  //
    }
    t=&a[0];

    for(i=0;i<n-1;i++)
    {
      for(j=0;j<n-i-1;j++)
      {
        if(*(t+j)>*(t+j+1))
        {
          k=*(t+j);    //是值交换,不是地址交换
          *(t+j)=*(t+j+1);
          *(t+j+1)=k;

        }
      }
    }
    
    for(i=0;i<n;i++)
    {
      if(i==n-1)  printf("%d\n",a[i]);
      else  printf("%d ",a[i]);
    }
  }

  return 0;
}

编码
Description
给你一个由大写字母组成的组成的字符串,你可以用如下规则对其进行编码:
1、 包含K个相同字母的连续字符串可以用KX表示,其中X是相同的字母。
2、 如果K为1,不输出K
Input
输入有多组,直到文件结束。每组一个字符串,长度为10000以内
Output
输出编码后的字符串。
Sample
Input
ABC
ABBCCC
Output
ABC
A2B3C
Hint

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[10004],p;
  int len,i,sum;
  while(scanf("%s",s)!=EOF)
  {
    len=strlen(s);
    sum=1;
    for(i=0;i<len;i++)   //注意此处
    {
      if(s[i]==s[i+1])
      {
        sum++;
      }
      else{
        if(sum==1)  printf("%c",s[i]);
        else
        {
          printf("%d%c",sum,s[i]);
          sum=1;  //注意此处


        } 

      }
       
    }

    printf("\n");
  }
  
  return 0;
}

回文串判定
Description
输入一串字符(长度小于100),判断该串字符是否是回文串(正序读与逆序读内容相同)。

Input
输入一串字符(长度小于100)。

Output
若该串字符是回文串输出“yes",否则输出”no“。

Sample
Input
asdfgfdsa
Output
yes

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[200];
  int n,i;
  gets(s);
  n=strlen(s);
  for(i=0;i<n;i++)
  {
    if(s[i]!=s[n-i-1])
      break;
  }

  if(i==n) printf("yes\n");
  else printf("no\n");
  
  return 0;
}
#include <stdio.h>             //哪里错了啊啊啊啊啊啊啊啊啊
#include<string.h>

int main()
{ 
  
  char s[200],p[200];
  int n,i;
  gets(s);
  n=strlen(s);
  for(i=0;i<n;i++)
  {
    p[i]=s[n-i-1];
  }

  if(strcmp(s,p)) printf("yes\n");
  else printf("no\n");
  
  return 0;
}

小鑫の日常系列故事(七)——小纸条
Description
小鑫在高中的时候喜欢上了一个十分漂亮的女孩。那个女孩也很喜欢他,就答应成为他的女朋友。
但是大家都知道高中的生活是忙碌的,除了上课就是上课,有时候可能连课间时间都被老师占用。于是小鑫想出了在上课给女朋友传纸条的方法来表达自己的爱慕。
又但是她与小鑫之间的距离太远,中间必须通过同学来传递纸条。可他们并不想让同学们知道写的什么就想到加密纸条这种方法。方法如下:
他们每天都会约定加密常数n,举个例子,当n=1时,今天写的每一句话中所用的字母都会向后+1,比如:i love you就成了j mpwf zpv ,当然了当是z的时候,+1就等于a。
请你帮他女朋友解密他写的纸条么?
Input
输入为多组,每组为两行。
第一行为n,-50<n<50
第二行为一句话,只有小写字母和空格。长度小于10000
Output
输出解密之后的内容
Sample
Input
1
j mpwf zpv
Output
i love you
Hint

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
/*
1.定义字符数组str[10001],偏移量n(n可以控制加密解密,n为解密,n取反为加密);
2.多组输入n,cin.geline()输入str,并且要吃掉回车,再根据偏移量n求余量为m
3.1遍历字符串,对于所有的字母(if语句),分三种情况处理,当偏移后仍在'a'~'z',直接修改
3.2当偏移后超过'z‘的,处理为 str[i]+m-'z'+'a'-1 | (str[i]+m-'z'是当前字符和'z'的间隔,-1是因为z到a也存在一个间隔)
3.3当偏移量低于'a’的,处理为 'z'-'a'+str[i]+m+1 | 也是因为间隔所以少减1
4.输出新串
*/
 
int n,m;
char str[10001];
int main()
{
    while(cin>>n)
    {
        n=-n;
        getchar(); 
        cin.getline(str,10001);
        m=n%26;
        for(int i=0; str[i]!='\0'; i++)
        {
            if(str[i]>='a'&&str[i]<='z')
            {
                if(str[i]+m>='a'&&str[i]+m<='z')
                {
                    str[i]=str[i]+m;
                }
                else if(str[i]+m>'z')
                {
                    str[i]=str[i]-'z'+'a'+m-1;
                }
                else
                {
                    str[i]='z'-('a'-str[i]-m)+1;
                }
            }
        }
        printf("%s\n",str);
    }
    return 0;
}
#include <stdio.h>              //哪里错了啊啊啊啊啊啊!!!!!!
#include<string.h>

int main()
{ 
  
  char s[10004];
  int len,i,n,j;
  while(scanf("%d",&n)!=EOF)
  {
    getchar();
    gets(s);
    
    len=strlen(s);
    for(i=0;i<len;i++)
    {
      if(s[i]>='a'&&s[i]<='z')
      {
        if(n<=0)
        {
          s[i]='a'+(s[i]+n-'a')%26;
          printf("%c",s[i]);
        }
        else {
        s[i]='z'-('z'-s[i]-n)%26;
        printf("%c",s[i]);
        }
      }
      else printf("%c",s[i]);
    }
    printf("\n");
  }
  
  return 0;
}

统计元音
Description
统计每个元音字母在字符串中出现的次数。

Input
输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串。

Output
对于每个测试实例输出5行,格式如下:

a:num1
e:num2
i:num3
o:num4
u:num5

多个测试实例之间由一个空行隔开。

Sample
Input
2
aeiou
my name is ignatius
Output
a:1
e:1
i:1
o:1
u:1

a:2
e:1
i:3
o:0
u:1

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[104],p;
  int len,i,n,j,num1,num2,num3,num4,num5;
  scanf("%d",&n);
  getchar();   //吃掉回车
  for(j=0;j<n;j++)
  {
   //scanf("%s",s);
    gets(s);
    len=strlen(s);
    num1=num2=num3=num4=num5=0;
    for(i=0;i<len;i++)
    {
      if(s[i]=='a') num1++;
      else if(s[i]=='e')  num2++;
      else if(s[i]=='i')  num3++;
      else if(s[i]=='o')  num4++;
      else if(s[i]=='u')  num5++;
    }
    printf("a:%d\n",num1);
    printf("e:%d\n",num2);
    printf("i:%d\n",num3);
    printf("o:%d\n",num4);
    printf("u:%d\n",num5);
    if(j!=n-1)  printf("\n");

  }
  return 0;
}

合法的C标识符
Description
给出一个标识符,请你判断它是否是C语言合法的标识符。

Input
输入一个标识符,长度不超过100。

Output
判断是否合法,如果是输出YES,否则输出NO。

Sample
Input
123You
Output
NO
Hint
C语言规定:标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。

#include <stdio.h>             
#include<string.h>

int main()
{ 
  char s[109];
  int n,i;
  int len;
 scanf("%s",s);
  n=strlen(s);
  if((s[0]>='a'&&s[0]<='z')||(s[0]>='A'&&s[0]<='Z')||(s[0]=='_'))
  {
    for(i=1;i<n;i++)
    {
      if(!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')||(s[i]=='_')||(s[i]>='0'&&s[i]<='9')))   //!
      {
        printf("NO\n");

        break;
      }
    }

    if(i==n)  printf("YES\n");
  }

  else printf("NO\n");
  
  return 0;
}

字符统计2
Description
输入英文句子,输出该句子中除了空格外出现次数最多的字符及其出现的次数。

Input
输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。

Output
逐行输出每个句子中出现次数最多的字符及其出现的次数(如果有多个字符的次数相同,只输出ASCII码最小的字符)。

Sample
Input
I am a student
a good programming problem
ABCD abcd ABCD abcd
Output
a 2
o 4
A 2
Hint

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	char str[100];
	int i;
	int cout[125];
	int mark;
	while(gets(str))
	{
		memset(cout,0,sizeof(cout));
		int n=strlen(str);
		for(i=0;i<n;i++)
		{
			if(str[i]!=' ')
			{
				cout[str[i]]++;  //
			}
		}
		int max=0;
		for(i=65;i<=122;i++)   //
		{
			if(max<cout[i])
			{
				max=cout[i];
				mark=i;
			}
		}
		printf("%c %d\n",mark,max);
	}
	return 0;
}

B - C语言实验——时间间隔
Description
从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示。
如:3点5分25秒应表示为–03:05:25.假设两个时间在同一天内,时间先后顺序与输入无关。

Input
输入包括两行。
第一行为时间点1。
第二行为时间点2。

Output
以“小时:分钟:秒”的格式输出时间间隔。

#include <stdio.h>
int main(void) {
    
  int h1,h2,m1,m2,s1,s2,m3,s3,h3;
  int time1,time2,time3;
  scanf("%d:%d:%d",&h1,&m1,&s1);     //是个位数,也可以直接用int吗,下面哈直接做乘法运算
  scanf("%d:%d:%d",&h2,&m2,&s2);
  time1=h1*3600+m1*60+s1;
  time2=h2*3600+m2*60+s2;
  if(time1>time2) time3=time1-time2;
  else time3=time2-time1;
  h3=time3/3600;
  m3=time3%3600/60;
  s3=time3%60;
  printf("%02d:%02d:%02d\n",h3,m3,s3);  //不足两位补零
  
    return 0;
}


时间格式转换
Description
24 小时制的时间格式为 “HH:mm”,如 “05:20”,而 12 小时制的时间格式为 “h:mm AM/PM”,如 “5:20 AM”。

24 小时制到 12 小时制的对应关系如下:

0 时:12 时 (AM)
1~11 时:1~11 时 (AM)
12 时:12 时 (PM)
13~23 时:1~11 时 (PM)
例如:“00:00” 对应 “12:00 AM”,“01:20” 对应 “1:20 AM”,“12:35” 对应 “12:35 PM”,“13:17” 对应 “1:17 PM”,“23:59” 对应 “11:59 PM”。

现在给你一个 24 小时制的时间,请你编写程序将其转换为 12 小时制的时间。

Input
输入只有一行,包含一个 24 小时制的时间。

Output
输出一行,表示转换为 12 小时制以后的时间。其中分钟部分若不足两位需要加 0 补足两位。

Sample
Input
00:05
Output
12:05 AM
Hint
输入部分可以使用 scanf(“%d:%d”) 读入;输出的数字部分可以使用 printf(“%d:%02d”) 输出。

#include <stdio.h>

int main(void) {
    
  int h1,m1;
  
  scanf("%d:%d",&h1,&m1);
  if(h1==0)
     printf("12:%02d AM\n",m1);
  else if(h1>0&&h1<12)
     printf("%d:%02d AM\n",h1,m1);
  else if(h1==12)    //注意题目给出的例子,输出的时如果是一位不在左边补零
      printf("12:%02d PM\n",m1);
  else if(h1>12&&h1<24)
      printf("%d:%02d PM\n",h1-12,m1);

  
    return 0;
}

N - 闰年
Description
时间过得真快啊,又要过年了,同时,我们的人生也增长了一年的阅历,又成熟了一些。可是,你注意过今年是不是闰年呢,明年呢?

以上是闰年的计算方法的流程图,聪明的你能否通过编程计算任意给出的一个年份是否是闰年呢?相信这个问题你能很快解决掉。

Input
只有一个整数year,代表年份。

Output
如果是闰年输出Yes,否则输出No。

Sample
Input
2000
Output
Yes

#include <stdio.h>

int main(void) {
    
  int year;
  
  scanf("%d",&year); //能被400整除,或者可以被4整除但不能被100整除
  if(year%400==0||(year%4==0&&year%100!=0))
     printf("Yes\n");
  
  else 
      printf("No\n");

  
    return 0;
}

输入数字星期,输出英文(switch语句)
Description
从键盘上输入数字星期,然后输出它的英文。
其对应关系是:
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday

Input
从键盘输入数字星期,输入数字在1-7之间。

Output
输出该数字对应的英文星期表示。

Sample
Input
2
Output
Tuesday

#include <stdio.h>

int main(void) {
    
  int x;
  
  scanf("%d",&x);
  switch(x)   //switch后面不是冒号而是大括号,case后面是冒号不是大括号
  {
    case 1:     //  switch  case   break  default,看一下default,他的后面也要跟语句,不能为空
      printf("Monday\n");
      break;
    case 2:
       printf("Tuesday\n");
       break;
    case 3:
       printf("Wednesday\n");
       break;
    case 4:
       printf("Thursday\n");
       break;
    case 5:
       printf("Friday\n");
       break;
    case 6:
       printf("Saturday\n");
       break;
    case 7:
       printf("Sunday\n");
       break;
    default:
      printf("error");
    
  }
  

  
    return 0;
}

小树快长高
Description
小明在植树节种了一棵小树,小明非常关心小树,每天都给小树浇水,盼望着小树快快长高。他知道小树现在有 n cm,每天长高k cm,他想知道多少天小树可以长到m cm。

Input
输入三个整数 n, m, k。 ( 0 <= n<= 10000, 0 <= m <= 10000,0 <= k <= 10000)

Output
输出一个整数,即需要的天数。

Sample
Input
100 200 5
Output
20

#include <stdio.h>
#include <math.h>
int main(void) {
    
  int n,m,k,day;
  
  scanf("%d %d %d",&n,&m,&k);
  if((m-n)%k==0)  //很简单,不要想复杂了,
     day=(m-n)/k;
  else
   day=(m-n)/k+1;
  printf("%d\n",day);
    
  
    return 0;
}

#include <stdio.h>
#include <math.h>
int main(void) {
    
  int n,m,k,day=0;
  
  
  scanf("%d %d %d",&n,&m,&k);
  while(n<m)
  {
    n=n+k;
    day++;

  }
  printf("%d\n",day);
    
  
    return 0;
}

A+B for Input-Output Practice (III)
Description
Your task is to Calculate a + b.
Input
Input contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed.
Output
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.
Sample
Input
1 5
10 20
0 0
Output
6
30

#include <stdio.h>     //错误代码,我不知道哪里错了
#include <math.h>
int main(void) {
    
  int n;
  int m;
  
  scanf("%d %d",&n,&m);
  while(n!=0&&m!=0)
  {
     printf("%d\n",m+n);
     scanf("%d %d",&n,&m);

  }
  
    
  
    return 0;
}

#include <stdio.h>  //正确代码
#include <math.h>
int main(void) {
    
  int n;
  int m;
  
  
  while(scanf("%d %d",&n,&m)!=EOF)
  {
    if(n==0&m==0)  break;
     printf("%d\n",m+n);
     

  }
  
    
  
    return 0;
}

H - C/C++训练1—最大公约数与最小公倍数
Description
输入两个正整数,求它们的最大公约数与最小公倍数。

Input
输入两个正整数,两个整数之间用空格分开。

数据保证在 int 范围内。

Output
第一行输出最大公约数;
第二行输出最小公倍数。

答案保证在 int 范围内。

Sample
Input
64 48
Output
16
192

#include <stdio.h>    
int main()
{
    int a,b,d;
    int n,m,t;
    int max,min;
    scanf("%d %d",&n,&m);
    if(n<m)
    {
      t=n;
      n=m;
      m=t;
    }
    a=n;b=m;d=a%b;
    while(d)
    {
      a=b;
      b=d;
      
      d=a%b;
    }
    max=b;
    min=n*m/max;
    printf("%d\n",max);
    printf("%d\n",min);

    return 0;
}

#include <stdio.h>//正确的,无语,哪里错了



int main()
{
    int a,b,t,a1,b1,m;
    scanf("%d%d",&a,&b);
    a1=a;
    b1=b;
    if(a1<b1){
        t=a1;
        a1=b1;
        b1=t;
    }

    while(b1>0){
        m=a1%b1;
        a1=b1;
        b1=m;
    }
    printf("%d\n",a1);
    printf("%d\n",(a*b)/a1);


    return 0;
}

打印菱形
Description
从键盘输入一个整数n(1≤n≤9),打印出指定的菱形。

Input
正整数n(1≤n≤9)。

Output
指定的菱形。
第一行前面有n-1个空格,第二行有n-2个空格,依此类推。

Sample
Input
5
Output
*








*
#include <stdio.h>
#include<math.h>
int main()
{
                                 //注意每一行输入的空格跟星与行数的关系
    int n,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
      for(j=n-i;j>0;j--)
        printf(" ");
      for(k=1;k<=2*i-1;k++)
       printf("*");
      
      printf("\n");
    }

    for(i=1;i<n;i++)    //下半边的输入   每一行的空格数和*要注意与行数和输入的n之间的关系
    {
      for(j=1;j<=i;j++)
        printf(" ");
      for(k=1;k<=2*n-1-2*i;k++)
       printf("*");
      

      printf("\n");
    }
   
    

    return 0;
}



水仙花数
Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,是这样定义的:

“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3153=1
3
+5
3
+3
3

现在要求输出所有在 mm 和 nn 范围内的水仙花数。

Input
输入数据有多组,每组占一行,包括两个整数 mm 和 nn (100 \le m \le n \le 999)(100≤m≤n≤999)
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于 mm,并且小于等于 nn,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;

如果给定的范围内不存在水仙花数,则输出 no

每个测试实例的输出占一行。

Sample
Input
100 120
300 380
Output
no
370 371
Hint

#include <stdio.h>
#include<math.h>
int main()      //注意端点值包不包括,还有端点值谁大谁小的问题,以及输入是否合法
{
    
    int n,m,a,b,c,x,i,flag;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
      flag=0;    //用来做有没有水仙花数的标志
      for(i=m;i<=n;i++)
      {
        a=i/100;
        b=i/10%10;
        c=i%10;
        if(a*a*a+b*b*b+c*c*c==i)
        {
          flag=1;
          printf("%d ",i);
        }
         
      }
      if(flag==0) printf("no");   //没有水仙花数
      printf("\n");    //注意换行符加在了这里,上一行代码没有加换行符
    }
    

    return 0;
}



余弦
Description
输入 nn 的值,计算 \cos xcosx
\cos x = 1 - \frac{x ^ 2}{2!} + \frac{x ^ 4}{4!} - \frac{x ^ 6}{6!} + \cdots + (-1) ^ {n} \frac{x ^ {2n}}{(2n)!}
cosx=1−
2!
x
2


+
4!
x
4



6!
x
6


+⋯+(−1)
n

(2n)!
x
2n

Input
输入数据有多行,每行两个数,包括 xx 和 nn。第一数据为 xx,第二个数据为 nn (n \le 100)(n≤100)。

Output
输出 \cos xcosx 的值,保留 44 位小数。

Sample
Input
0.0 100
1.5 3
Output
1.0000
0.0701

#include <stdio.h>
#include<math.h>
int main()
{
                                 //还要看是不是要强制类型转换
    int n,i;
    double a,x,sum;
    while(scanf("%lf %d",&x,&n)!=EOF)     //注意n不一定是说n项求和,一定要看题目
    {
      a=1.0;
      sum=1.0;
      for(i=1;i<=n;i++)
      {
        a=-a*x*x/((2*i)*(2*i-1));
        sum=sum+a;
      }
      printf("%.4lf\n",sum);
    }
    

    return 0;
}



完美的素数
Description
素数又称质数。指一个大于1的自然数,除了1和此整数自身外,不能被其他自然数整除的数。我们定义:如果一个素数是完美的素数,当且仅当它的每一位数字之和也是一个素数。现在给你一个正整数,你需要写个程序判断一下这个数按照上面的定义是不是一个完美的素数。

Input
输入包含多组测试数据。
每组测试数据只包含一个正整数 n (1 < n <= 10^6)。

Output
对于每组测试数据,如果 n 是完美的素数,输出“YES”,否则输出“NO”(输出均不含引号)。

Sample
Input
11
13
Output
YES
NO

#include <stdio.h>         //没用利用函数,较为繁琐     1不是素数(质数)
#include<math.h>
int main()
{
    
    int n,i,flag,sum;
    
    while(scanf("%d",&n)!=EOF)
    {
      if(n==1)  printf("NO\n");
      else
       {
         flag=1;
        for(i=2;i<=sqrt(n);i++)
        {
          if(n%i==0)
           {
             flag=0;
              break;
           }
        }
        if(flag==0) printf("NO\n");
        else{     //n是素数,接下来验证数字之和。
           sum=0;
           while(n/10)
           {
             sum=sum+n%10;
             n=n/10;
             
           }
           sum=sum+n;
           if(sum==1)  printf("NO\n");  
           else
           {
            
             for(i=2;i<=sqrt(sum);i++)
             {
               if(sum%i==0)
                {
                  flag=0;
                   break;
                }
             }
             if(flag==0)  printf("NO\n");
             else printf("YES\n");

           }
       }
      
    }
    
    }
    return 0;
}





#include <stdio.h>                 //利用了函数
#include<math.h>

int judge(int n)               //用来判断是否为素数
{
  int i,flag=1;
  
           if(n==1)  return 0;      //1不是素数,单独讨论
           else
           {
            
             for(i=2;i<=sqrt(n);i++)
             {
               if(n%i==0)
                {
                  flag=0;
                   break;
                }
             }
             if(flag==0)  return 0;
             else return 1;

           }
}
int main()
{
    
    int n,i,flag1,flag2,sum;
    
    while(scanf("%d",&n)!=EOF)
    {
      flag1=judge(n);
      if(flag1==0) printf("NO\n");
      else{
        sum=0;
           while(n/10)
           {
             sum=sum+n%10;
             n=n/10;
             
           }
           sum=sum+n;
           flag2=judge(sum);
           if(flag2==0)   printf("NO\n");
           else   printf("YES\n");
      }
      
      
    }
    

    return 0;
}




A+B for Input-Output Practice (IV)
Description
Your task is to Calculate the sum of some integers.

Input
Input contains multiple test cases. Each test case contains a integer N, and then N integers follow in the same line. A test case starting with 0 terminates the input and this test case is not to be processed.

Output
For each group of input integers you should output their sum in one line, and with one line of output for each line in input.

Sample
Input
4 1 2 3 3
5 1 2 4 4 5
0
Output
9
16

#include <stdio.h>
#include<math.h>


int main()
{
    
    int n,i,x,sum;
    
    while(scanf("%d",&n)!=EOF)      //此题注意一下输入的代码是怎么写的
    {
      
      if(n==0)  break;
      else
       {
         sum=0;
         for(i=0;i<n;i++)
         {
           scanf("%d",&x);
           sum=sum+x;
         }
         printf("%d\n",sum);
       }
      
      
    }
    

    return 0;
}



C/C++程序训练6—歌德巴赫猜想的证明
Description
验证“每个不小于6的偶数都是两个素数之和”,输入一个不小于6的偶数n,找出两个素数,使它们的和为n。

Input
输入一个不小于6的偶数n。

Output
找出两个素数,使它们的和为n。只需要输出其中第一个素数最小的一组数据即可。

Sample
Input
80
Output
80=7+73

#include <stdio.h>                 //利用了函数
#include<math.h>

int jisuan(int n)      //判断是否为质数
{
 int i;
 if(n==1)  return 0;
 else{
   for(i=2;i<=sqrt(n);i++)
   {
     if(n%i==0)  break;
   }
   if(i>sqrt(n))  return 1;
   else return 0;

 }

  
}
int main()
{
   
   int n,i;
   int x,y;
   scanf("%d",&n);
   for(i=2;i<=n/2;i++)    //从i<n到i<n-1(因为1不是,所以n-1不用算了)到i<=n/2(因为如果没有,不用重复循环,但此题是一定会有,所以改不改都行,因为循环不到。)
   {
      x=jisuan(i);       
      y=jisuan(n-i);
      if(x!=0&&y!=0)
      {
        printf("%d=%d+%d\n",n,i,n-i);
        break;
      }
   }
  

  

    return 0;
}

N!
Description
给出两个数 n, m。求 3748-1 和 3748-2。

计算公式:

3748-3

Input
输入数据有多组(数据组数不超过 250),到 EOF 结束。

对于每组数据,输入两个用空格隔开的整数 n, m (0 <= m <= n <= 20) 。

Output
对于每组数据输出一行, 3748-1 和 3748-2,用空格隔开。

提醒:因为n!和 m! 数据较大,定义数据类型应用 long long int,输出格式%lld

Sample
Input
1 1
5 3
4 3
Output
1 1
60 10
24 4
Hint
请注意数据范围,可能需要使用 long long 等 64 位整型,输出格式%lld

#include <stdio.h>                 //利用了函数
#include<math.h>

void jisuan(int n,int m)
{
 int i;
 long long int a=1,b=1,c=1;     //各阶,设为了long long int
 long long int x,y;    //表示最后让求的,注意设为了long long int,因为一定是整数,不会是小数,所以不用担心
 for(i=1;i<=n;i++)
 {
   a=a*i;
   if(i<=m) b=b*i;
   if(i<=n-m) c=c*i;
 }
 x=a/c;
 y=a/(b*c);
 printf("%lld %lld\n",x,y);      //没有在main函数中输出,而是在调用的函数中输出

 }

  

int main()
{
   
   int n,m;
   
   while(scanf("%d %d",&n,&m)!=EOF)
   {
     jisuan(n,m);
   }

  

    return 0;
}

分段函数
Description
函数是一种特殊的映射,即数集到数集的映射。对于给定的每个自变量都能给出一个确定的值,这是一件多么牛的事情呀。其实不是函数牛,而是因为它具有这种性质我们的数学家才这么定义了它。函数有很多类型,虽然本质都是映射,但为了方便研究和应用,数学家们做了很多分类。比如线性函数,非线性函数,随机函数,还有一些具有特殊性质的函数等等。

今天我们要关注的是分段函数,所谓分段就是对于整个定义域来说,函数的值域是不连续的。很明显的一个就是绝对值函数,类似于y=|x|,(x,y属于R)。不连续是按照自变量的连续变化函数值的变化不连续而已,但函数仍然不离不弃的给了每个自变量一个值。

总之,函数就是按照规则对自变量进行操作得到相应的值。而程序里的函数就更牛了,它可以对我们的输入(自变量)进行各种我们想做的操作,最后得到输出(值),很好玩吧。

今天,就希望你能用程序里的函数实现数学里的分段函数,加油哦。

这个分段函数长得是这个样子的:

F(x) = log2(x) 0<x<10

   = |x|+sin(x)    x<0
   = 0                 x=0
   = x^2            x>=10 

Input
输入第一行给出数据的组数T。
接下来T行每行一个实数X。

Output
输出T行,每行一个函数值,四舍五入保留到小数点后两位。
希望你能根据函数的表达式,对于给定的每个自变量不离不弃的计算出它的值。

Sample
Input
4
0
10
5
-1
Output
0.00
100.00
2.32
0.16
Hint
log2(x)是以2为底x的对数.

#include <stdio.h>                 //利用了函数
#include<math.h>

void jisuan(double x)
{
 double y;
 if(x>0&&x<10) y=log2(x);
 else if(x==0)  y=0;  //x是double
 else if(x<0)  y=-x+sin(x);  //  x是double所以不能用fabs
 else y=x*x;
  printf("%.2lf\n",y);
 }

  

int main()
{
   
   double x;
   int t,i;
   
   scanf("%d",&t);
   for(i=1;i<=t;i++)
   {
     scanf("%lf",&x);
     jisuan(x);
   }

  

    return 0;
}

M - 计算组合数
Description
计算组合数。C(n,m),表示从n个数中选择m个的组合数。
计算公式如下:
若:m=0,C(n,m)=1
否则, 若 n=1,C(n,m)=1
否则,若m=n,C(n,m)=1
否则 C(n,m) = C(n-1,m-1) + C(n-1,m).

Input
第一行是正整数N,表示有N组要求的组合数。接下来N行,每行两个整数n,m (0 <= m <= n <= 20)。

Output
输出N行。每行输出一个整数表示C(n,m)。
Sample
Input
3
2 1
3 2
4 0
Output
2
3
1
Hint

#include <stdio.h>                 //利用了函数
#include<math.h>

int jisuan(int n,int m)   //这里利用的是递归,也可以使用for循环
{
 if(m==0)  return 1;
 else if(n==1)  return 1;
 else if(m==n) return 1;
 else  return jisuan(n-1,m-1)+jisuan(n-1,m);
}

  

int main()
{
   
   
   int n,t,i,m;
  
   scanf("%d",&t);
   
     for(i=1;i<=t;i++)
     {
       scanf("%d %d",&n,&m);
       printf("%d\n",jisuan(n,m));
     }
   
   

  

    return 0;
}

最值
Description
有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。
请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。

Input
输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列。

Output
输出转换好的序列。数据之间用空格隔开。

Sample
Input
6
2 3 8 1 4 5
Output
1 3 5 2 4 8

#include <stdio.h>                //要注意输入的n是1,不是1,合法性
#include<math.h>                  //如果最小值在第一位  最大值在最后一位你的代码还对不对

int main()
{
   
   
   int i,j,k,min,max,t,n;
   int a[11];
   scanf("%d",&n);
   scanf("%d",&a[1]);
   min=max=a[1];
   j=k=1;
     for(i=2;i<=n;i++)
     {
       scanf("%d",&a[i]);
       if(min>a[i])
       {
         min=a[i];
         j=i;  //最小的
       }
       if(max<a[i])
       {
         max=a[i];
         k=i;   //最大的
       }
       
     }
     t=a[j];
     a[j]=a[1];
     a[1]=t;

     t=a[k];
     a[k]=a[n];
     a[n]=t;
    for(i=1;i<=n;i++)
     printf("%d ",a[i]);
    printf("\n");
   

  

    return 0;
}

区间之和
Description

给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算序列号在L,R 这段位置区间内所有数的总和。

Input

输入只有一组测试数据:

测试数据的第一行为一个整数 n (1< n < 10000);

第二行为 n 个 int 类型的整数;

第三行为两个整数 L,R(0 < L < R <= n)。

Output

输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内。

Sample
Input
5
3 5 6 2 9
2 4
Output
13

#include <stdio.h>                 //读懂题意
#include<math.h>



int main()
{
   
   
  int n,i,sum,l,r,a[10000];
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    {
      scanf("%d",&a[i]);
    }
  scanf("%d %d",&l,&r);
  
  sum=0;
  for(i=l;i<=r;i++)
  {
    
    
      
       sum=sum+a[i];
    }
  
  
  
  printf("%d\n",sum);
    return 0;
}

分割整数
Description
从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。

Input
正整数n,不含前导零。

Output
分割的整数序列,各整数之间用空格格开。
注意,最后一个数字后面没有空格!

Sample
Input
678123
Output
6 7 8 1 2 3

#include <stdio.h>                 //尽管说是正序分割,但还是倒叙,但因为结果要求正序输出,所以要有数组存,将数组倒叙输出。若是倒序输出,不用数组,边割边输出
#include<math.h>



int main()
{
   
   
  int n,i,j,a[13];
  scanf("%d",&n);
  i=0;
  while(n)
  {
    a[i++]=n%10;
    n=n/10;
  }
  
  for(j=i-1;j>=0;j--)
  {
    if(j==0) printf("%d\n",a[j]);
    else printf("%d ",a[j]);
  }
  
  
  
 
    return 0;
}

数日子
Description
光阴似箭,日月如梭,大学的时间真是宝贵,要抓紧时间AC_。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?

Input
输入第一行是数据的组数n<100,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。

Output
输出所输入的日期是这一年的第几天。

Sample
Input
2
2009 1 1
2008 1 3
Output
1
3

#include <stdio.h>                 //利用了函数
#include<math.h>



int main()
{
   
   
  int a,b,c,i,j,n,sum,flag;  //没有用switch和for,那样太麻烦,有12个情况
  int p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    flag=0;
    scanf("%d %d %d",&a,&b,&c);
    if(a%400==0||(a%4==0&&a%100!=0))
    {
      flag=1;   //是闰年
    }
    sum=0;   //第几天,初始化
    for(j=0;j<b;j++)
    {
       sum=sum+p[j];
    }
    if(b>2&&flag==1) sum=sum+1+c;  //大于二月且是闰年,加一
    else sum=sum+c;
    printf("%d\n",sum);
  }
  
 
    return 0;
}

#include <stdio.h>                 //冒泡
#include<math.h>



int main()
{
   
   
  int a[102],i,j,t,n;
  scanf("%d",&n);
  for(i=0;i<n;i++)
    scanf("%d",&a[i]);
  

  for(i=0;i<n-1;i++)
  {
    for(j=0;j<n-i-1;j++)
    {
      if(a[j]>a[j+1])
      {
        t=a[j];
        a[j]=a[j+1];
        a[j+1]=t;
      }
    }
  }
  for(i=0;i<n;i++)
  {
    printf("%d ",a[i]);
  }
  printf("\n");
 
    return 0;
}

排序问题
Description
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。
Input
输入数据有一行,包含10个整数,用空格分开。
Output
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。
Sample
Input
1 2 3 5 4 6 8 9 10 7
Output
1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9

#include <stdio.h>                 //
#include<math.h>



int main()
{
   
   
  int a[12],i,j,t,n,b[12];
  
  for(i=0;i<10;i++)
  {
     scanf("%d",&a[i]);
     b[i]=i+1;
  }
    
  

  for(i=0;i<9;i++)
  {
    for(j=i+1;j<10;j++)
    {
      if(a[i]>a[j])
      {
        t=a[i];
        a[i]=a[j];
        a[j]=t;

        t=b[i];
        b[i]=b[j];
        b[j]=t;

      }
    }
  }
  for(i=0;i<10;i++)
  {
    printf("%d ",a[i]);
  }
  printf("\n");

  for(i=0;i<10;i++)
  {
    printf("%d ",b[i]);
  }
  printf("\n");
 
    return 0;
}

数列有序!
Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。
Sample
Input
3 3
1 2 4
0 0
Output
1 2 3 4
Hint

#include <stdio.h>                 //利用了函数
#include<math.h>



int main()
{
   
   
  int a[102],i,j,t,n,m;
  while(scanf("%d %d",&n,&m)!=EOF)
  {
    if(n==0&&m==0)  break;
    else
     {
       for(i=0;i<n;i++)
       {
         scanf("%d",&a[i]);
       }
       t=0;   //表示插入的位置;
       for(i=0;i<n;i++)
       {
         if(m<=a[i])  break;
         else t++;
       }
       for(i=n;i>t;i--)
       {
         a[i]=a[i-1];
       }
       a[t]=m;
       n++;

       for(i=0;i<n;i++)
       {
         printf("%d ",a[i]);
       }

       printf("\n");
     }
  }
  
 
    return 0;
}

次大和次小
Description
对于一个数组,次大的数指数组中第二大的数,相似地,次小的数指数组中第二小的数。

给定一个含有 n 个数的数组(数组中的数互不相同),求其中次大的数和次小的数。

Input
首先输入一个整数 T (1 <= T <= 200),表示数据组数。

对于每组数据:

第 1 行输入一个整数 n (2 <= n <= 1000),表示数组中元素的数量。
第 2 行输入 n 个用空格隔开的整数 Ai (-10000 <= Ai <= 10000),表示数组中每一个元素的值。
Output
对于每组数据,输出一行,包含 2 个整数 a, b,分别表示次大和次小的数。

#include <stdio.h>                 //利用了函数
#include<math.h>



int main()
{
   
   
  int a[1002],i,j,n,t,x,y,z;
  int max,min;
  
  scanf("%d",&t);
  for(int k=0;k<t;k++)
  {
    scanf("%d",&n);
    for(i=0;i<n;i++)
       scanf("%d",&a[i]);
    
    for(i=0;i<2;i++)
    {
      for(j=0;j<n-i-1;j++)
      {
        if(a[j+1]>a[j])    //小到大
        {
           x=a[j];
           a[j]=a[j+1];
           a[j+1]=x;
        }
      }
    }
    min=a[n-2];


    for(i=0;i<2;i++)
    {
      for(j=0;j<n-i-1;j++)
      {
        if(a[j+1]<a[j])    //小到大
        {
           x=a[j];
           a[j]=a[j+1];
           a[j+1]=x;
        }
      }
    }
    max=a[n-2];

    printf("%d %d\n",max,min);



  }
  return 0;
}

#include <stdio.h>                 //利用了函数
#include<math.h>



int main()
{
   
   
  int a[1002],i,j,n,t,x,y,z;
  int max,min;
  
  scanf("%d",&t);
  for(int k=0;k<t;k++)
  {
    scanf("%d",&n);
    for(i=0;i<n;i++)
       scanf("%d",&a[i]);
    
    for(i=0;i<2;i++)
    {
      for(j=i+1;j<n;j++)
      {
        if(a[i]>a[j])    //小到大
        {
           x=a[i];
           a[i]=a[j];
           a[j]=x;
        }
      }
    }
    min=a[1];


    for(i=0;i<2;i++)
    {
      for(j=i+1;j<n;j++)
      {
        if(a[i]<a[j])    //小到大
        {
           x=a[i];
           a[i]=a[j];
           a[j]=x;
        }
      }
    }
    max=a[1];

    printf("%d %d\n",max,min);



  }
  return 0;
}

数组逆序
Description
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

Input
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。

Output
按先后顺序输出n个整数。

Sample
Input
5 1 2 3 4 5
2
Output
4 5 1 2 3

#include <stdio.h>                 
#include<math.h>
int main()
{
                      //也可以使用for循环改变输入次序,而不对数组做出操作,数组不变
   
  int a[102],b[102],i,n,m,k;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
  }
  scanf("%d",&m);
  for(i=0;i<n;i++)
  {
    k=(i+m)%n;
    b[k]=a[i];
  }
  for(i=0;i<n;i++)
  {
    printf("%d ",b[i]);
  }
  printf("\n");


  
  
  
  return 0;
}

矩阵输出
Description
输入n个整数,输出由这些整数组成的n行矩阵。

Input
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。

Output
以输入的整数为基础,输出有规律的n行数据。

Sample
Input
5
3 6 2 5 8
Output
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3

#include <stdio.h>                 //利用了函数
#include<math.h>
int main()
{
   
   
  int a[102],i,n,m,k,j;
  scanf("%d",&n);

  for(i=0;i<n;i++)
  {
    scanf("%d",&a[i]);
  }

  for(i=0;i<n;i++)   //原行输出
  {
    if(i==n-1)  printf("%d\n",a[i]);
    else printf("%d ",a[i]);
  } 

  for(i=0;i<n-1;i++)    //变换行
  {
    k=a[n-1];
    for(j=n-1;j>0;j--)     //进行数组循环移位
    {
      a[j]=a[j-1];
    }
    a[0]=k;      //for循环嵌套,注意自增符号要有不同,注意是增增还是减

    for(j=0;j<n;j++)    //循环数组输出
   {
    if(j==n-1)  printf("%d\n",a[j]);
    else printf("%d ",a[j]);
   }

    
  }


  
  
  
  return 0;
}

矩阵的舞蹈
Description
矩阵是非常美妙的东西,可以用来解方程,以及解决一些图论的问题等,应用很广泛。即使没有学过线性代数,大家也一定接触过矩阵,在编程中可以理解为二维的表。

矩阵有很多操作就像舞蹈一样,如行列的置换,矩阵的转置等。今天我们只看矩阵的旋转,希望得到当前矩阵顺时针旋转90度以后得到的矩阵。

Input
输入数据的第一行是一个正整数T,代表有T组测试样例。接下来T组数据,每组数据第一行是两个整数M,N (0 < M , N < 100),分别代表矩阵的行数和列数。然后是矩阵本身,共M行,每行N个数据用空格隔开。

Output
对于每组输入的矩阵,第一行输出Case #k:(k为该组数据的序号,具体格式见样例),然后输出其旋转后的矩阵。

Sample
Input
2
4 4
1 2 3 4
5 6 7 8
6 6 6 6
8 8 8 8
2 3
1 2 3
4 5 6
Output
Case #1:
8 6 5 1
8 6 6 2
8 6 7 3
8 6 8 4
Case #2:
4 1
5 2
6 3

#include <stdio.h>                 //利用了函数
#include<math.h>



int main()
{
   
   
  int a[103][103],t,i,j,n,m,sum,max,x,y=0;
  scanf("%d",&t);
  for(x=0;x<t;x++)
  {
    scanf("%d %d",&m,&n);
    for(i=0;i<m;i++)
    {
      for(j=0;j<n;j++)
      {
        scanf("%d",&a[i][j]);
      }
    }
    y++;
    printf("Case #%d:\n",y);
 
    for(i=0;i<n;i++)
    {
      for(j=m-1;j>=0;j--)
      {                    //原矩阵先行变换在列变换,因此内循环是行,且从最后一行向上
        if(j==0) printf("%d\n",a[j][i]);
        else printf("%d ",a[j][i]);
      }
    }
  }
  return 0;
}

杨辉三角
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),表示将要输出的杨辉三角的层数。
输入以0结束。
Output
对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。
Sample
Input
2
3
0
Output
1
1 1

1
1 1
1 2 1

#include <stdio.h>                 //利用了函数
#include<math.h>
int main()
{
   
   
  int a[103][103],t,i,j,n,m,sum,max,x,y=0;
  while(scanf("%d",&n)!=EOF)
  {
    if(n==0)  break;
    else{
      for(i=1;i<=n;i++)
    {
      for(j=1;j<=i;j++)
      {
         if(j==1||j==i)  a[i][j]=1;    //每行第一个和最后一个
         else{
           a[i][j]=a[i-1][j-1]+a[i-1][j];
         }
      }
    }

    for(i=1;i<=n;i++)
    {
      for(j=1;j<=i;j++)    //j的范围是i
      {
        if(j==i) printf("%d\n",a[i][j]);  //每行最后一个
        else printf("%d ",a[i][j]);
      }
    }
    printf("\n");

    }
    
  }
  return 0;
}

鞍点计算
Description
找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。同一行和同一列没有相同的数。

Input
输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。

Output
按下列格式输出鞍点:

Array[i][j]=x

其中,x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。

一个二维数组并不一定存在鞍点,此时请输出None。

我们保证不会出现两个鞍点的情况,比如:

3 3
1 2 3
1 2 3
3 6 8

Sample
Input
3 3
1 2 3
4 5 6
7 8 9
Output
Array[0][2]=3

#include <stdio.h>             
#include<math.h>

int main()
{ 
  int a[103][103],i,j,k,n,m,max,p;
  while(scanf("%d %d",&m,&n)!=EOF)
  {
    
    for(i=0;i<m;i++)
    {
      for(j=0;j<n;j++)
      {
        scanf("%d",&a[i][j]);
      }
    }
    
    for(i=0;i<m;i++)     //循环每一行,找到每一行的最大值
    {
      max=a[i][0];
      for(j=0;j<n;j++)   //此循环用来找到找到该行最大值
      {
        if(a[i][j]>max)
        {
          max=a[i][j];
          k=j;    //记录这一行最大值的列标
        }
      }
      for(p=0;p<m;p++)   //此循环用来看找到的此行最大值在那一列是否是最小值
      {
        if(a[p][k]<max)   //不是最小值,直接结束该循环
        {
          
          break;
        }
      }
      if(p==m)    //意味着行最大值对应的列循环中途没有结束,即,是该列最小值
      {
       
        printf("Array[%d][%d]=%d\n",i,k,a[i][k]);
        break;    //输出就结束是因为题目已经说明,只有一个或零个鞍点
      }
    }

    if(i==m)  printf("None\n");    //意味着全部行都循环完毕,中途没有结束,即无鞍点

  }
  return 0;
}

字符串分割
Description
bLue 获得了一个字符串,现在他要把这个字符串按照某个分隔符来分割成若干个字符串,你能帮他实现吗?

Input
输入数据有多组(数据组数不超过 100),到 EOF 结束。

每组数据输入一行,格式为 “s c”,其中 s 为一个不含空格且长度不超过 1000 的字符串,表示待分割的字符串;c 为一个不是空格的字符,表示分隔符。

输入数据保证在待分割的字符串中,分隔符至少出现一次且不会出现在字符串开头或末尾,并且不会出现连续多个分隔符的情况。

Output
对于每组数据,输出分割后的字符串,每个字符串占一行。

Sample
Input
123,DE ,
0123.a,/45/6.8 /
Output
123
DE
0123.a,
45
6.8

#include <stdio.h>             
#include<string.h>

int main()
{ 
  char s[1006],c;
  int len,i;
  while(scanf("%s %c",s,&c)!=EOF)   //字符型数组输入没有取地址符
  {
    len=strlen(s);
    for(i=0;i<len;i++)     //最简单的一种情况,因为题目注明只有此一种情况,所以未分类讨论
    {
      if(s[i]==c)  printf("\n");     //分隔符不输出,遇到分隔符换行
      else printf("%c",s[i]);
    }
    printf("\n");   //不要忘记这个换行
  }



  return 0;
}

删除指定字符
Description
从键盘输入一个字符串给str和一个字符给c,删除str中的所有字符c并输出删除后的字符串str。

Input
第一行是一个字符串,不超过100个字符;
第二行是一个字符。

Output
删除指定字符后的字符串。

Sample
Input
sdf$ s d f sdf sdf
$
Output
sdfsdf

#include <stdio.h>             
#include<string.h>

int main()
{ 
  int i,n;
  char s[101],c;
  gets(s);
  //scanf("%s",s);      //如果使用此行,将会错误,因为使用scanf缓冲区会
                        //遗留回车,回车键将会直接给下一个输入,此代码下一个输入是
                        //scanf,scanf遇回车结束输入,因此c变量根本无法输入
  n=strlen(s);           //如果使用这一行也可以,就是还要在其后加一个getchar来吃掉
  scanf("%c",&c);        //缓冲区的回车
  for(i=0;i<n;i++)
  {
    if(s[i]!=c)
    {
      printf("%c",s[i]);
    }
  }
  printf("\n");
  return 0;
}
  • 全字母句
    Description
    全字母句 (pangram) 指包含字母表中全部 26 种英文字母(不区分大小写)的句子,其常被用于展示英文字体的显示效果。

现在,bLue 得到了很多句子,他想知道哪些句子是全字母句。

Input
输入数据有多组(数据组数不超过 100),到 EOF 结束。

每组数据包含一行长度不超过 100 的字符串。

Output
对于每组数据,输出一行。

如果是全字母句则输出 “Yes”,否则输出 “No”(不包括引号)。

Sample
Input
The quick brown fox jumps over the lazy dog.
The 6th ACM Funny Programming For/While Contest
Output
Yes
No

#include <stdio.h>             
#include<string.h>

int main()
{ 
  char s[104];
  int len,i,sum;
 
 while(gets(s))      //字符串多组输入,用这个
  {
    int a[30]={0};
    len=strlen(s);
    for(i=0;i<len;i++)
    {
      if(s[i]>='a'&&s[i]<='z')    //大小写看作一样,因此用了一个标记数组
      {
        a[s[i]-'a']=1;
      }
      else if(s[i]>='A'&&s[i]<='Z')
      {
        a[s[i]-'A']=1;
      }
    }
    sum=0;
    for(i=0;i<30;i++)
    {
      if(a[i]!=0) sum++;
    }

    if(sum==26)  printf("Yes\n");     //26个字母
    else printf("No\n");
  }
  return 0;
}

小鑫の日常系列故事(二)——石头剪子布
Description
小鑫在上幼儿园的时候,喜欢跟小伙伴健健玩石头剪子布的游戏 ,你能帮他们判断谁胜谁负么?

Input
输入有两行,每一行都有可能为“Rock”(石头),“Scissors”(剪子),”Cloth”(布)。第一行为小鑫的选择,第二行为健健的选择。
Output
输出有一行,如果小鑫赢了输出“Win”,输了输出“Lose”,平局输出“Equal”。(输出不包括引号)
Sample
Input
Rock
Scissors
Output
Win
Hint

#include<stdio.h>             
#include<string.h>

int main()
{ 
  
  char str1[18],str2[18];
  int x,y;
  int p;
  scanf("%s %s",str1,str2);
  x=strlen(str1);     //原本我的思路h是石头剪刀布复制1、2、3、,然后这个更简单
  y=strlen(str2);
  if(x==y)  printf("Equal\n");
  else if((x==4&&y==8)||(x==8&&y==5)||(x==5&&y==4))
    printf("Win\n");
  else printf("Lose\n");
  return 0;
}

找老乡
Description

新学期开始了,在学校勤学苦练的LeiQ有一天收到一个名单,上面有n个人的信息(姓名和地址),LeiQ知道有多少人是他的老乡以及老乡的名字。

Input
多组输入,每组的第一行是一个整数n(1<=n<=100),表示名单上人的数量。

接下来一行有一个字符串表示LeiQ的地址(1<=len<=20)

接下来n行,每行两个字符串,第一个是姓名,第二个是地址

Output
先输出老乡的名字(按照输入的顺序),最后输出老乡的人数。

Sample
Input
4
Laiyang
Xiaoming Laiyang
Xiaohong Heze
Xiaohuang Laiwu
Xiaoguang Laiyang
Output
Xiaoming
Xiaoguang
2
Hint

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char str1[25],str2[25],my[25];
  int n,sum,i;
 //while(scanf("%d",&n))   //用这个错了
 //while(~scanf("%d",&n))   //用这个也可以
while(scanf("%d",&n)!=EOF)
{
  scanf("%s",my);
  sum=0;
  for(i=0;i<n;i++)
  {
    scanf("%s %s",str1,str2);
    if(strcmp(my,str2)==0)
    {
      puts(str1);   //自带换行
      //printf("%s\n",str1);
      sum++;
      
    }
  }
  
  printf("%d\n",sum);
}
  return 0;
}

简单字符串排序
Description
从键盘输入10个学生的姓名和成绩,请按字典序排列学生的姓名并输出(姓名和成绩对应关系保持不变)。

Input
输入共11行,前10行每行是一个学生的姓名,最后一行是10个用空格分开的整数表示对应的10个学生成绩。(姓名大小不超过20个字符)

Output
输出姓名按字典序排列后的学生姓名和成绩,共10行,每个学生的姓名和成绩占一行,姓名和成绩间用逗号分开。
Sample
Input
Bush
White
Mark
Jean
Black
Wood
Jenny
Frank
Bill
Smith
78 85 96 65 46 83 77 88 54 98
Output
Bill,54
Black,46
Bush,78
Frank,88
Jean,65
Jenny,77
Mark,96
Smith,98
White,85
Wood,83
Hint

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char name[11][23],t[23];
  int score[12],p,j,i;
  for(i=0;i<10;i++)
  {
    gets(name[i]);
  }
  for(i=0;i<10;i++)
  {
    scanf("%d",&score[i]);
  }

  for(i=0;i<10-1;i++)
  {
    for(j=0;j<10-i-1;j++)
    {
      if(strcmp(name[j],name[j+1])>0)    //姓名按照字典惊醒排序,就
      {                                  //按字符串惊醒排序,使用strcmp
        strcpy(t,name[j]);    //此处应注意不是=  ,strcpy!!!!!!
        strcpy(name[j],name[j+1]);
        strcpy(name[j+1],t);

        p=score[j];
        score[j]=score[j+1];
        score[j+1]=p;


      }
    }
  }

  for(i=0;i<10;i++)
  {
    printf("%s,%d\n",name[i],score[i]);
  }

  return 0;
}

简单编码
Description
将一串文本译成密码,密码的规律是:
将原来的小写字母全部翻译成大写字母,大写字母全部翻译成小写字母,数字的翻译规律如下:

0——>9
1——>8
2——>7
3——>6
4——>5
5——>4
6——>3
7——>2
8——>1
9——>0

然后将所有字符的顺序颠倒。
Input
输入一串文本,最大字符个数不超过100。
Output
输出编码后的结果。
Sample
Input
china
Output
ANIHC
Hint

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[102],ss[102];
  int len,i;

  gets(s);
  len=strlen(s);
  for(i=0;i<len;i++)
  {
    if(s[i]>='a'&&s[i]<='z')  ss[i]=s[i]-32;
    else if(s[i]>='A'&&s[i]<='Z') ss[i]=s[i]+32;
    else if(s[i]>='0'&&s[i]<='9') ss[i]='9'-s[i]+'0';   //注意一下数字的变化
    else ss[i]=s[i];                                //从整数来看是9-s[i],但从字    
  }                                                 //符来看是'9'-s[i]+'0'
 for(i=len-1;i>=0;i--)
 {
   printf("%c",ss[i]);
 }
 printf("\n");

  return 0;
}

回文串判定
Description
输入一串字符(长度小于100),判断该串字符是否是回文串(正序读与逆序读内容相同)。

Input
输入一串字符(长度小于100)。

Output
若该串字符是回文串输出“yes",否则输出”no“。

Sample
Input
asdfgfdsa
Output
yes

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[104],ss[104],p;
  int len,i,sum,j;
  gets(s);
  len=strlen(s);
  i=0;j=len-1;
  while(i<j)
  {
    if(s[i]==s[j])
    {
      i++;
      j--;
    }
    else{
      printf("no\n");
      break;
    }
  }
  if(i==j||i>j)  printf("yes\n");
  
  return 0;
}
#include <stdio.h>          //错误代码,哪里错了,????///   
#include<string.h>

int main()
{ 
  
  char s[104],ss[104],p;
  int len,i,sum;
  gets(s)
  len=strlen(s);
  for(i=0;i<len;i++)
  {
    ss[i]=s[len-1-i];
  }
  if(strcmp(s,ss))  printf("yes\n");
  else printf("no\n");
  
  return 0;
}


S - 简单密码破解
Description
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈.
接下来渊子要在密码之上再加一套密码,虽然简单但也安全。
假设渊子原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。
他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先边成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。
Input
输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾。
Output
输出渊子真正的密文。
Sample
Input
YUANzi1987
Output
zvbo941987
Hint

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[104],p;
  int len,i,n,j;
  while(gets(s))
  {
    
    len=strlen(s);
    for(i=0;i<len;i++)
    {
      if(s[i]>='a'&&s[i]<='z')
      {
        if(s[i]=='a'||s[i]=='b'||s[i]=='c')   //读懂题
         printf("2");
        else if(s[i]=='d'||s[i]=='e'||s[i]=='f')
          printf("3");
        else if(s[i]=='g'||s[i]=='h'||s[i]=='i')
          printf("4");
        else if(s[i]=='j'||s[i]=='k'||s[i]=='l')
          printf("5");
        else if(s[i]=='m'||s[i]=='n'||s[i]=='o')
          printf("6");
        else if(s[i]=='p'||s[i]=='q'||s[i]=='r'||s[i]=='s')
          printf("7");
        else if(s[i]=='t'||s[i]=='u'||s[i]=='v')
          printf("8");
        else if(s[i]=='y'||s[i]=='w'||s[i]=='x'||s[i]=='z')
          printf("9");
      }
      else if(s[i]>='A'&&s[i]<='Z')
      {
        p=s[i]+32;
        printf("%c",'a'+(p+1-'a')%26);
      }

      else printf("%c",s[i]);
    }
    printf("\n");
  }
  
  return 0;
}

单词统计
Description
从键盘输入一行字符(长度小于100),统计其中单词的个数,各单词以空格分隔,且空格数可以是多个。

Input
输入只有一行句子。仅有空格和英文字母构成。

Output
单词的个数。

Sample
Input
stable marriage problem Consists of Matching members
Output
7

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[104],p;
  int len,i,n,j,num1,num2,num3,num4,num5;
  int sum=0;
  gets(s);
  len=strlen(s);
  for(i=0;i<len-1;i++)
  {
    if(((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))&&(s[i+1]==' '))
    {
      sum++;
    }
  }
  if(s[len-1]!=' ')  sum++;    //最后一个位置不是空
  printf("%d\n",sum);
  
  return 0;
}

保留整数
Description
输入一个字符串str1,把其中的连续非数字的字符子串换成一个‘*’,存入字符数组str2 中,所有数字字符也必须依次存入 str2 中。输出str2。

Input
输入为一行字符串str1,其中可能包含空格。字符串长度不超过80个字符。

Output
输出处理好的字符串str2。

Sample
Input
$Ts!47&s456 a23 +B9k
Output
47456239*

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[104],ss[104];
  int len,i,n,j;
  
  gets(s);
  len=strlen(s);
  j=0;
  for(i=0;i<len;i++)
  {
    if(s[i]>='0'&&s[i]<='9')
    {
      ss[j++]=s[i];
    }
    else{
      if(ss[j-1]!='*')  //ss里面不允许有连续的*
         ss[j++]='*';
    }
  }
  puts(ss);
  
  return 0;
}

字符串排序
Description
输入3个字符串,按字典序从小到大进行排序。
Input
输入数据有一行,分别为3个字符串,用空格分隔,每个字符串长度不超过100。
Output
输出排序后的三个字符串,用空格分隔。
Sample
Input
abcd cdef bcde
Output
abcd bcde cdef

#include <stdio.h>             
#include<string.h>

int main()
{ 
  
  char s[3][104],d[104];
  int i,j;
  scanf("%s %s %s",s[0],s[1],s[2]);
  for(i=0;i<2;i++)
  {
    for(j=0;j<2-i;j++)
    {
      if(strcmp(s[j],s[j+1])>0)
      {
        strcpy(d,s[j]);
        strcpy(s[j],s[j+1]);
        strcpy(s[j+1],d);
      }
    }
  }
  printf("%s %s %s\n",s[0],s[1],s[2]);
  
  
  return 0;
}

X的旅游计划
Description
X在最后的几周安心学习,考试有惊无险,so,X和女友就要计划一下放假后的时间了,来一场说走就走的旅行,这是两个人的一致想法,但是究竟去哪里玩,就要好好考虑一下了。

X和他的女友都有一些自己想去的地方,于是X想让大家帮他找一找两个人都想去的地方。

Input
测试案例有多组,每个案例:

第一行输入两个数n,m(n < 100 && m < 100)。X想要去的地方有n个,女友想要去的地方有m个。

之后n行,每行一个字符串(长度小于10)表示X想去的地名。

之后m行,每行一个字符串(长度小于10)表示女友想去的地名。

Output

将在n中和在m中都出现过得字符串输出(字典序)。

如果没有相同的字符串,输出”sad!”(不含引号)。

Sample
Input
2 2
aaa
bbb
aaa
bbb
Output
aaa
bbb
Hint

#include <stdio.h>             
#include<string.h>

int main()
{ 
  char s[103][12],ss[103][12],sss[103][12];
  int len,i,j,n,m;
  while(scanf("%d %d",&n,&m)!=EOF)
  {
    for(i=0;i<n;i++)
    {
      scanf("%s",s[i]);     //使用gets错误,为什么?因为回车键
      //gets(s[i]);          //如果想使用gets要在for循环上加getchar
    }
    for(i=0;i<m;i++)
    {
      scanf("%s",ss[i]);
      //gets(ss[i]);
    }

    len=0;
    for(i=0;i<n;i++)
    {
      for(j=0;j<m;j++)
      {
        if(strcmp(s[i],ss[j])==0)
        {
           strcpy(sss[len++],ss[j]);
           break;
        }
      }
    }
    if(len==0)  printf("sad!\n");
    else{
      for(i=0;i<len-1;i++)
      {
        for(j=0;j<len-i-1;j++)
        {
          if(strcmp(sss[j],sss[j+1])>0)
          {
            strcpy(s[0],sss[j]);
            strcpy(sss[j],sss[j+1]);
            strcpy(sss[j+1],s[0]);
          }
        }
      }
      for(i=0;i<len;i++)
      {
        puts(sss[i]);
      }
    }



  }
  return 0;
}

小泉的难题
Description
机械实验班有个同学叫小泉,有一天数学老师给小泉布置了一道个人作业,给小泉M(M<=100)组数据,每组数据有N个正整数(N<=100)让他把每组的N个数按升序排成一行,但由于数的数目比较多,人工做很费时,于是小泉就想到了喜欢编程序的你,请你帮他解决这个问题,可不要让他失望噢。
Input
输入包括M+1行,第一行是两个正整数M、N;M表示总共多少组数据,下面M行每行包含N个正整数。(输入数据之间会用空格隔开)
Output
输出包括M行,每行分别对应输入中M组数据的升序序列,数与数之间用一个空格隔开。
Sample
Input
2 3
1 3 2
4 2 6
Output
1 2 3
2 4 6
Hint

#include <stdio.h>       //使用指针数组排序             
#include<string.h>

void swap(int *a)
{
  int p;
  p=*a;      //值
  *a=*(a+1);
  *(a+1)=p;
}
int main()
{ 
  int m,n,a[103],i,j,k;
  int *p;
  void swap(int *a);    //函数的声明
  scanf("%d %d",&m,&n);
  for(k=0;k<m;k++)
  {
    for(i=0;i<n;i++)
    {
      scanf("%d",&a[i]);
    }
    p=a;
    for(i=0;i<n-1;i++)
    {
      for(j=0;j<n-i-1;j++)
      {
        if(*(p+j)>*(p+j+1))
        {
          swap(p+j);   //实参是地址
        }
      }
    }
    p=a;
    for(i=0;i<n;i++)
    {
      if(i!=n-1)  printf("%d ",*(p+i));
      else printf("%d\n",*(p+i));
    }


  }
  return 0;
}

矩阵下三角元素之和
Description
输入一个正整数n(1<=n<=10),再输入n*n的矩阵,要求求该矩阵的下三角元素之和。

Input
输入包括n+1行。
第一行为整数n;
接下来的n行为矩阵数据。

Output
矩阵的下三角元素之和。

Sample
Input
5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
Output
75

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main(){                     //最简单的不为难自己的做法
    int n,a[11][11],i,j,sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
      for(j=0;j<n;j++)
      {
        scanf("%d",&a[i][j]);
        if(i>=j)   sum=sum+a[i][j];
      }
    }

    printf("%d\n",sum);
    return 0;
}
 
#include <stdio.h>             
#include<string.h>      


int main()
{ 
  
  int m,n,a[13][13],i,j,k;         //二维数组指针
  int sum;
  
  scanf("%d",&n);
  sum=0;
  for(i=0;i<n;i++)
  {
    for(j=0;j<n;j++)
    {
       scanf("%d",*(a+i)+j);   //*(a+i)表示a[i][0]的地址  
       if(i>=j)  sum=sum+*(*(a+i)+j);//*(a+i)+j表示a[i][j]的地址
    }
  }

  printf("%d\n",sum);
  return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main(){      //也是使用的指针,二维数组,一维指针
    int *q, sum, i, j, n, a[10][10];
    scanf("%d", &n);
    sum = 0;
    q = a[0];
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            scanf("%d", (q + i*n + j));  //q指向的是a[0][0]的地址,
            if(i >= j){              //q + i*n + j则表示的是a[i][j]的地址
                sum += *(q + j + i * n);
            }
        }
    }
    printf("%d\n", sum);
    return 0;
}
 
 

又见回文
Description
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。

Input
有多组输入,每行输入一串字符,保证所有数据字符串长度之和不会大于 10 ^ 510
5
,字符串由大小写英文字母和空格组成,以字符串“2013”作为结束标志。

Output
每行输出一个字符串,如果输入是回文串,输出“YES”,否则输出“NO”(注意:判断的时候空格是不作判断的,详见样例)。

Sample
Input
aaaa
ggg g
lozxvxoMJBCHsTXooXTsHCBJMoxvxzol
i am a good acmer
2013
Output
YES
YES
YES
NO
Hint

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 int judge(char *s)
 {
   int len=strlen(s);    //形参还能用与求长度
   int i,j;       //char *p,*q;
   i=0;j=len-1;   //p=s;q=s+n-1;
   while(i<j)      //while(p<q)     //p是前面的地址,q是后面的地址
   {
     if(*(s+i)==' ')   //就把是s[i]换为*(s+i)即可    //if(*p==' ')
     {
        i++;     //p++;
        continue; 
     }
     if(*(s+j)==' ')    //是空格继续循环,直到s[i],s[j]  //if(*q==' ')
    {
      j--;                //q--;
      continue;

    }
     if(*(s+i)==*(s+j))           //均不是空格,才执行相等判断   if(*p==*q)
     {                     
      i++;          //p++;
      j--;          //q--;
     }
     else return 0;      //不相等就直接return 0相当于break了,
   }                    //比break还厉害,返回值,并且循环之外的操作也不执行了
   return 1;    //while循环顺利执行完毕,中间没有中断,即是回文
 }
int main(){                     //注意空格,空格要跳过
    char s[100008];
    while(gets(s))
    {
      if(strcmp(s,"2013")==0)    //加双引号
         break;
      else{
        if(judge(s)==0)  printf("NO\n");
        else printf("YES\n");
      }
    }
    return 0;
}
 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值