BIT--C语言(大一上徐特立乐学部分)做题记录

//求最大素数

#include<stdio.h>

#include<math.h>

int main()

{

    int m,i;

    scanf("%d",&m);

    for (m;m>1;m--){

        for (i=2;i<1+m/2;i++){

            if(!(m%i)) break;

            if (i>=m/2){

               printf("The max prime number is %d.\n",m);  

               return 0;    

            }

        }

    }

    return 0;

 }

//求任意年的母亲节在五月哪一天

#include<stdio.h>

#include<math.h>

int main()

{

   int y, c, m, d, w, year;

   scanf("%d", &year);

  

   m = 5; d = 1;

y = year % 100;

    c = year / 100;

    w = y+y/4+c/4-2*c+26*6/10;

    while (w<0){

     w+=7;

}

    w =w% 7;

    switch (w){

     case 0:w=8;break;

     case 1:w=14;break;

     case 2:w=13;break;

     case 3:w=12;break;

     case 4:w=11;break;

     case 5:w=10;break;

     case 6:w=9;break;

}

    printf("%d\n",w);

}

//寻找阿姆斯特朗数

#include<stdio.h>

#include<math.h>

int main()

{

int sum,n,j,a=1,b,c,d,e=1,m=0,i;

scanf("%d",&n);

for(i=1;i<n;i++){

a*=10;

}

for(i=a;i<10*a;i++){

b=i;sum=0;

for(;b;b/=10){

c=b%10;e=1;

for (d=1;d<=n;d++){

e*=c;

}

sum+=e;

}

if(sum==i){

printf("%d\n",i);

m=1;

}

}

if(!m){

printf("No output.\n");

}

  return 0;

}

//打印数字菱形

#include<stdio.h>

#include<math.h>

   int main()

{

   int n,m,i,j,k,g;

   scanf("%d",&n);

   for(i=1;i<=n;i++){

    for(g=1;g<=n-i;g++){

    printf("  ");

   }

for(j=1;j<=i;j++){

printf("%-2d",n+1-j);

}   

for(k=n-i+2;k<=n;k++){

printf("%-2d",k);

}

printf("\n");

   }

   m=n-1;

   for(i=1;i<=m;i++){

    for(g=1;g<=i;g++){

    printf("  ");

}

for(j=n;j>i;j--){

printf("%-2d",j);

}

for (k=i+2;k<=n;k++){

printf("%-2d",k);

}

printf("\n");

   }

   return 0;

}

//给出任意一天,计算那天是星期几

#include<stdio.h>

#include<math.h>

int main()

{

   int y, c, m, d, w=0, year, month, day;

   scanf("%d %d %d", &year, &month, &day);

   m = month; d = day;

   /*判断数据是否合法 */

   if ((month>=13)||(month<=0)){

     printf("month is error.\n");

     return 0;

   }

   if (day<=0){

    printf("day is error.\n");

    return 0;

   }

   /*runnian*/

   if ((0==year%4)&&(0!=year%100)||

       ( 0==year%400)){

        w=1;

   }

   switch (m){

     case 1:

     case 3:

     case 5:

     case 7:

     case 8:

     case 10:

     case 12:if (day>31){

                printf("day is error.\n");

            return 0;

        };break;

     case 4:

 case 6:

 case 9:

 case 11: if(d>30){

    printf("day is error.\n");

return 0;

    };break;

 case 2: if(1==w){if((d>29)){

        printf("day is error.\n");

        return 0;

   }

   }else if (d>28){

    printf("day is error.\n");

    return 0;

   } break;

    }

   /*计算对应的星期几 */

  

   if ((m == 1) || (m ==2 ))

    {

      m += 12;year--;

    }

y = year % 100;

    c = year / 100;

    w = y+y/4+c/4-2*c+13*(m+1)/5+d-1;

    while (w<0){

     w+=7;

}

    w =w% 7;

    printf("%d\n", w);

}

//打印空心倒三角形

#include<stdio.h>

#include<math.h>

   int main()

{

   int n,i,j,g;

   scanf("%d",&n);

   if(1==n){

    printf("*\n");

    return 0;

   }

   for(i=1;i<=2*n-1;i++){

    printf("*");

   }

   printf("\n");

   for(i=2;i<=n-1;i++){

    for(g=1;g<=i-1;g++){

    printf(" ");

   }

   printf("*");

for(j=1;j<2*(n-i);j++){

printf(" ");

}

printf("*\n");  

   }

   for(i=1;i<=n-1;i++){

      printf(" ");  

   }

   printf("*\n");

   return 0;

}

//组成最大数

#include<stdio.h>

#include<math.h>

   int main()

{

   int arr[10]={-1};int i=0,x,max,m,j,g;

   scanf("%d",&x);

   do{

    arr[i]=x%10;

    x/=10;

i+=1;

   }while (x);

   for(j=0;j<=i-1;j++){

    max=arr[0];

    m=0;

    for(g=0;g<=i;g++){

    if (max<arr[g]){

    max=arr[g];

    m=g;

   }    

  }

  if(-1!=max){

   printf("%d",max);

    arr[m]=-1;

  }

    }

    printf("\n");

   return 0;

}

//计算后续日期

#include <stdio.h>

#include <math.h>

int main(){

int year,month,day,n;

int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

while(scanf("%d %d %d\n %d",&year,&month,&day,&n)!=EOF){

if((0==year%4)&&(0!=year%100)||

   (0==year%400)){

mon[2]=29;

}

else

mon[2]=28;

for(int i=1;i<=n;i++){

day+=1;

if(day>mon[month]){

day=day-mon[month];

month++;

if(month>12){

year++;

month=1;

if((year%4==0&&year%100!=0)||year%400==0){

mon[2]=29;

}

else

mon[2]=28;

}

}

}

printf("%d.%d.%d\n",year,month,day);

}

return 0;

}

//有问题的程序:统计字符数、单词数、行数

#include <stdio.h>

#include <math.h>

int main(){                     //1为数字,2为字母

int lines=0,words=0,chars=1,alei=0,blei=0;char a,b;

a=getchar();

if(-1==a){

printf("Lines:0\nWords:0\nChars:0\n");

}

if(10==a){

lines+=1;

}

while(1){

b=getchar();

chars+=1;

if(10==b){

lines+=1;

}

if((a>=48)&&(a<=57)){// a是数字

alei=1;

}else if((a>=65)&&(a<=90)){//a是字母

alei=2;

}else if((a>=97)&&(a<=122)){//a是字母

alei=2;

}else{

alei=3;

}

if((b>=48)&&(b<=57)){//b是数字

blei=1;

}else if((b>=65)&&(b<=90)){//b是字母

blei=2;

}else if((b>=97)&&(b<=122)){//b是字母

blei=2;

}

if(1==alei&&2==blei){//数字后有字母

words--;

}

if((2==alei)&&(32==b)){

words++;

}

if((2==alei)&&(10==b)){

words++;

}

if((2==alei)&&(9==b)){

words++;

}

if((2==alei)&&(EOF==b)){

words++;printf("Lines:%d\nWords:%d\nChars:%d\n",lines,words,chars-1);

        return 0;

}

if(EOF==b){

    printf("Lines:%d\nWords:%d\nChars:%d\n",lines,words,chars-1);

        return 0;}

a=b;

}

}

//输入行数 n 和首数字字符,在屏幕上输出由数字围起的高和下底宽度均 n 的空心梯形。 要求:输出的数字是循环的,即输出数字 9 后再输出的数字是 0。

#include <stdio.h>

#include <math.h>

int main(){                     

    int hangshu,chuzhi,yin,i,j,zhongzhi;int arr[11]={-1};

    scanf("%d %d",&hangshu,&chuzhi);

    

    for(i=1;i<=hangshu;i++){// lines

       

     if(1==i){//first line

         printf("%d",chuzhi);

arr[1]=chuzhi;

            yin=(chuzhi+1)%10;

     for(j=2;j<=(3*hangshu-2)/2;j++){

     printf("%2d",yin);

     arr[j]=yin;

     yin++;

     yin%=10;

    }

    if(((3*hangshu-2)%2)&&(hangshu!=1)){

     printf("%2d",yin);

}

for(j=(3*hangshu-2)/2;j>0;j--){

printf("%2d",arr[j]);

}

    printf("\n");

    yin=(chuzhi+1)%10;

    continue;

}

for(j=1;j<=2*i-3;j++){//front sps

    printf(" ");

}

if(i==hangshu){//last line

  for(j=1;j<=hangshu/2;j++){//numbers in last line

     printf("%2d",yin);

     arr[j]=yin;

     yin++;

     yin%=10;

  }   

  if(hangshu%2){

   printf("%2d",yin);

  }

  for(j=hangshu/2;j>0;j--){

   printf("%2d",arr[j]);

  }

  printf("\n");

}

if(i>1&&i<hangshu){//middle lines

  printf("%2d",yin);  

  for(j=1;j<=3*hangshu-2*i-2;j++){

   printf("  ");

  }

  printf("%2d",yin);

  yin++;

  yin%=10;

  printf("\n");

}

}

   return 0;

}

//请输出满足以下条件的 n 位正整数的个数:

要求该n位整数的从高位开始前 1 位可以被 1 整除,前 2 位可以被 2*2 整除,前 3 位可以被 3*3 整除,前 4 位可以被 4*4 整除......。即该整数前 k 位都可被 k 平方整除。

例如:n=1,则符合条件的1位正整数为1~9,输出答案 9。n=2,符合条件的正整数为:12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96,则输出答案22。当n=4时,2432就是一个符合题意的整数。第一位 2 可以被1整除;前2位24可以被4整除;前3位243可以被9整除;整个4位2432可以被16整除。

    int n,inf,sup,counter=0,nf,start,i,j,jf,temp;

    scanf("%d",&n);

    switch (n){

     case 0 :printf("0\n");return 0;

     case 1 :printf("9\n");return 0;

     case 2 :inf=10;break;

     case 3 :inf=100;break;

     case 4 :inf=1000;break;

     case 5 :inf=10000;break;

     case 6 :inf=100000;break;

     case 7 :inf=1000000;break;

     case 8 :inf=10000000;break;

};

sup=10*inf;

nf=n*n;

for(i=1;start<inf;i++){

start+=nf;

}

for(start;start<sup;start+=nf){

temp=start;

for(j=n-1;j>=1;j--){

jf=j*j;

temp/=10;

if(temp%jf){

break;

}

if(1==j){

    counter+=1;

}

}

}

printf("%d\n",counter);

//我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。

这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。

程序的输入是两个数字 M 和 N( 其十进制的值不超过 1000000000) ,它们的进制在 2~36 之间。对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。

求出分别在 2~36 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。当然了,对于多种可能成立的情况,找出符合要求的进制最小的一组就行了。

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <string.h>

typedef long long ll;

#define rep(i,l,r) for(ll i=l;i<=r;i++)

#define per(i,l,r) for(ll i=r;i>=l;i--)

#define eif else if

#define N 100005

#define max(a,b) a>b?a:b

#define min(a,b) a<b?a:b

void Qsort(int *a,int l,int r){

    if(l>r)

        return;

    int temp=a[l];

    int i=l,j=r;

    while(i!=j)

    {

        while(a[j]>=temp&&i<j)

        {

            j--;

        }

        while(a[i]<=temp&&i<j)

        {

            i++;

        }

        if(i<=j)

        {

            int t=a[i];

            a[i]=a[j];

            a[j]=t;

        }

    }

    a[l]=a[i];

    a[i]=temp;

    Qsort(a,l,i-1);

    Qsort(a,i+1,r);

    return;

}

int erfen(int *a,int x,int left,int right){

    if(left==right){

        if(a[left]==x)

            return left;

        else

            return -1;

    }

    int mid=(left+right)/2;

    if(x==a[mid])

        return mid;

    eif(x<=a[mid]&&x>=a[1])

    return erfen(a,x,left,mid);

    eif(x>=a[mid]&&x<=a[right])

    return erfen(a,x,mid+1,right);

    else

        return -1;

}

int spow(int x,int y){

    int ans=1;

    for(int i=1;i<=y;i++){

        ans=ans*x;

    }

    return ans;

}

ll zhuan(char *str,int n,int m){

    int len=strlen(str);

    int a[len+1];

    for(int i=0;i<len;i++){

        if(str[i]>='0'&&str[i]<='9')

            a[i]=str[i]-'0';

        else

            a[i]=str[i]-'A'+10;

    }

    int sum=0;

    for(int i=0;i<len;i++){

        a[i]=a[i]*spow(n,len-i-1);

        sum+=a[i];

    }

    char ss[1005];

    int nm=-1;

    while(sum){

        int u=sum%m;

        if(u<10){

            char c=u-0+'0';

            nm++;

            ss[nm]=c;

        }

        sum/=m;

    }

    ll ans=0;

    per(i,0,nm) {

        ans=ans*10+(int)(ss[i]-'0');

    }

    return ans;

}

int main(){

    char str[1005];

    scanf("%s",str);

    int len=strlen(str);

    int p=0;

    rep(i,0,len-1){

        int cnt;

        if(str[i]>='0'&&str[i]<='9')

            cnt=str[i]-'0';

        else

            cnt=str[i]-'A'+10;

        p=max(p,cnt);

    }

    char str1[1005];

    scanf("%s",str1);

    int len1=strlen(str1);

    int q=0;

    rep(i,0,len1-1){

        int cnt;

        if(str1[i]>='0'&&str1[i]<='9')

            cnt=str1[i]-'0';

        else

            cnt=str1[i]-'A'+10;

        q=max(q,cnt);

    }

    int flag=0;

    rep(i,p+1,36){

        ll nm1=zhuan(str,i,10);

        rep(j,q+1,36){

            ll nm2=zhuan(str1,j,10);

            if(nm1==nm2){

                printf("%s (base %lld) = %s (base %lld)\n",str,i,str1,j);

                flag=1;

                break;

            }

        }

        if(flag==1)

            break;

    }

    if(flag==0){

        printf("%s is not equal to %s in any base 2..36\n",str,str1);

    }

    return 0;

}

//

看着这样的“回”形图案你晕吗?

让我们不用数组,来做出它。

输入:

    n。正方形的边长

输出:

    边长为 n 的数字回形方阵。

#include "stdio.h"

#define MAX 101

int main(int argc, char **argv){

int i, j, n = 4;

int arr[MAX][MAX];

int state = 0, num = 0;

int flag_count = 0;     //记录当前点的四周有几个点不能走

scanf("%d", &n);

getchar();

//初始化

for (i = 0; i <= n+1; i++){

for (j = 0; j <= n+1; j++){

//加围墙,-1

if (i == 0 || i == n+1 || j == 0 || j == n+1){

arr[i][j] = -1;

continue;

}

arr[i][j] = 0;

}

}

//输出初始化后的矩阵

printf("初始化后的矩阵:\n");

for (i = 0; i <= n+1; i++){

for (j = 0; j <= n+1; j++){

printf("%3d", arr[i][j]);

}

printf("\n");

}

printf("\n输出脚印:\n");

i = 1; j = 1;

while (1){

//如果四个方向都走过了,说明已经结束了

if (flag_count == 4){

printf("此点四个方向都走过了,跳出。\n", i, j);

break;

}

//如果碰到已走过的,或者围墙,则退一步。退一步其实是为了改变方向

//其实这个点就是需要改变方向的点

if (arr[i][j] != 0){

switch (state){

case 0:           //当前方向为右,向左退

j--;break;

case 1:           //当前方向为下,向上退

i--;break;

case 2:           //当前方向为左,向右退

j++;break;

case 3:           //当前方向为上,向下退

i++;break;

}

//改变方向

state = (state + 1) % 4;

flag_count++;

printf("改变方向的点:(%d, %d)\n", i, j, num);

}

else{

arr[i][j] = ++num;

flag_count = 0;

printf("(%d, %d) = %3d\n", i, j, num);

}

switch (state){

case 0:           //向右走

j++;break;

case 1:           //向下走

i++;break;

case 2:           //向左走

j--;break;

case 3:           //向上走

i--;break;

}

}

//输出结果

printf("\n结果:\n");

  for (i = 1; i <= n; i++){

for (j = 1; j <= n; j++){

  printf("%3d", arr[i][j]);

}

printf("\n");

}

return 0;

}

//对于非常大或者非常小的数据,我们通常用科学记数法来表示。例如在科技文献和电脑中经常遇到的 2.3×106 (计算机中的科学记数法表示为:2.3E6),或者 9.18×10-5 (科学记树法表示:9.18E-5)这种类型的数据。

输入:

    用科学记数法表示的数据。即为符合C语言表示的科学记数法表示。

输出:

    该数据的双精度表示

说明:

    输入数据的精度不高于小数点后50位。

    输入数据时,在实数和幂之间有空格进行分隔,空格个数不定。

    结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入的处理。

#include <stdio.h>

#include<math.h>

int main(){

int arr[100];int flen=0,blen=0,i=0,j=0,k=1,ci=0,e=1;char cc;

    for(i=0;i<100;i++){//initialize

arr[i]=0;

}

i=0;

do{//输入小数点前的部分

cc=getchar();

ci=cc;

if((ci>=48)&&(ci<=57)){//判断为数字则存入数组

arr[i]=ci-48;i++;

flen++;//记录整数的位数

}

if(cc=='.'){//检测到小数点

         break;

}

if(cc==' '){//检测到空格

break;

}

    } while(1);

i=flen;

    if('.'==cc){  //上个循环于小数点处结束,输入小数部分

      do{

          cc=getchar();

          ci=cc;

      

          if((ci>=48)&&(ci<=57)){//判断为数字,输入

             arr[i++]=ci-48;

         blen++;//记录小数的位数

          }

      if(cc==' '){//检测到空格,小数输入结束

  break;

      }

    } while(1);

 }

//end numbers input

do{

cc=getchar();

if((cc='e')||(cc='E')){

scanf(" %d",&e);

break;

}

}while(1);//Nothing wrong above

//printf("%d\n%d\n%d\n",flen,blen,e);

if(e>0){

for(j=0;j<flen+e;j++){

printf("%d",arr[j]);

}

printf(".");

for(k=flen+e;k<flen+e+8;k++){

printf("%d",arr[k]);

}

printf("\n");

return 0;

}

if(e==0){

for(j=0;j<flen;j++){

printf("%d",arr[j]);

}

printf(".");

for(k=flen;k<flen+8;k++){

printf("%d",arr[k]);

}

printf("\n");

return 0;

}

if(e<0){//power is nagetive

e=0-e;

if(e>=flen){//左移超出整数位数

printf("0.");

if((e-flen)<=8){

         for(j=1;j<=e-flen;j++){

     printf("0");

}}else{

for(j=1;j<=8;j++){

printf("0");}

}

for(k=0;k<=(7-e+flen);k++){

printf("%d",arr[k]);

}

printf("\n");

}else{//左移不超过整数位数

            for(i=0;i<(flen-e);i++){

printf("%d",arr[i]);

}

printf(".");

for(i=flen-e;i<(flen-e+8);i++){

printf("%d",arr[i]);

}

printf("\n"); return 0;

}

}

}

  • 描述
  • 为了最大程度地节约存储空间,经常需要把信息进行编码。一种很有效的编码方法是用数字来表示一串字符。假设这些字符串都是由不重复的英文小写字母组成的,且每个字符串中的英文字母都是从小到大排列的。
  • 这个编码系统按照如下的方式工作:
  • 字符串是按照长度从小到大的顺序排列的
  • 长度相同的字符串,是按照字典需排列的
  • 则根据这个编码系统,所有的字符串从 a 开始可以编码如下:
  • a - 1 b - 2 ... z - 26 ab - 27 ... az - 51 bc - 52 ... vwxyz - 83681 ...
  • 那么,请编程计算出一个字符串在这个编码系统下编码后的值是多少。
  • 输入
  • 输入的第一行为 N,表示有 N 组数据。后面的 N 行每行包含一个不超过 10 个字母的字符串。
  • 输出
  • 输出字符串所对应的编码,如果该字符串不能被编码,则输出 0。
  • #include <stdio.h>  #include <ctype.h>  #include <string.h>  #include <math.h>   
  • long long int function(int st,int x,int n)  {  
  •     int i;    long long int sum=0;  
  •     if(n==1) return x-st+1;  
  •     for(i=st;i<=x;i++)  {  
  •         sum+=function(i+1,26,n-1);  
  •     }  
  •     return sum;  
  • }  
  • long long int com(char str[]) {  
  •     int n,i;  
  •     long long int sum=0;  
  •     n=strlen(str);  
  •     for(i=0;i<n;i++)   {  
  •         if(i==0)  { sum+=function(1,str[i]-'a',n-i);  }
  •         else{  
  •             sum+=function(str[i-1]-'a'+1+1,str[i]-'a'+1-1,n-i);  
  •             if(str[i]<=str[i-1])   {  //不能编码
  •                 return 0;  
  •             }  
  •         }  
  •     }  
  •     sum++;  
  •     for(i=1;i<n;i++)  {  
  •         sum+=function(1,26,i);  
  •     }  
  •     return sum;  
  • }  
  • int main()  {  
  •     int n,i;  
  •     long long int ans;  
  •     char s[20];  
  •     scanf("%d",&n);  
  •     for(i=0;i<n;i++)  {  
  •         scanf("%s",&s);  
  •         ans=com(s);  
  •         printf("%d\n",ans);  
  •     }  
  •     return 0;  

Description

众所周知,联盟有很多水王,他们的发贴数是如此之多,以至于必须要用高精度数才能保存。

为了迎接国庆,联盟决定举行一次水王争霸赛,比赛的规则是将这些水王截止到2030年9月30日23时59分59秒这一刻所发的总贴数从大到小进行排序。每个水王当然都想取得尽量靠前的名次,所以他们竭尽全力,不择手段地进行灌水。

终于,激动人心的一刻到来了,2030年10月1日0时0分0秒,你作为裁判得到了每个水王的发贴数,现在,你的任务是公正地把这些水王按照发贴数从大到小进行排序。

Input

输入的第一行是一个1到1000的整数N,表示总共有N位水王参加了争霸赛。

以下依次给出每位水王的描述,一位水王的描述占据两行,第一行为一个仅由字母和数字组成的长度不超过20的字符串,代表这个水王的ID,第二行一个高精度的整数(非负数),代表这个水王的发贴数。注意,这个整数的首位没有不必要的0。

所有水王发贴数数字的总长度(注意,是总长度而不是总和)不会超过10000。除了子母、数字和必要的换行,输入中不会出现空格等字符。

Output

依次输出按照发贴数从大到小排好序的各位水王的ID,每个ID占据单独的一行。不能有任何多余的字符。若几个ID的发贴数相同,则按照ID的字典顺序先后排列。

注意:算法内存有限制,定义的数组不能超过此限制

#include<stdio.h>  

#include<string.h>  

char id[1002][21],shi[10100];  

int feiwu[1003]={0},l[1002],s[1002]={0};  

int main() {  

    int i,j,k,n;  

    scanf("%d",&n);  n位水王

    for(i=0;i<n;i++) {  

        scanf("%s",&id[i]);                         ID

        scanf("%s",&shi[feiwu[i]]);                   贴数

        feiwu[i+1]=strlen(shi);  

        l[i]=feiwu[i+1]-feiwu[i];  

        s[i]=i;  

    }      

    int tmp,max;  

    for(i=0;i<n-1;i++)  {             排n次序

        for(j=0;j<n-1-i;j++) {             

            if(l[j]<l[j+1]){  

                max=l[j+1];  

                l[j+1]=l[j];  

                l[j]=max;  

                tmp=s[j+1];  

                s[j+1]=s[j];  

                s[j]=tmp;  }  }   }                                 

    for(i=0;i<n-1;i++)   {  

        for(j=i+1;j<n;j++)  {  

            if(l[i]==l[j])  {  

                int flag=2;  

                for(k=feiwu[s[i]];k<feiwu[s[i]+1];k++)  

                {  

                    if(shi[k]>shi[k-feiwu[s[i]]+feiwu[s[j]]])   

                    {  

                        flag=1;break;  

                    }  

                    else if(shi[k]<shi[k-feiwu[s[i]]+feiwu[s[j]]])   

                    {  

                        flag=0;break;  

                    }  

                }  

                if(!flag)  

                {  

                    tmp=s[i];  

                    s[i]=s[j];  

                    s[j]=tmp;     

                }   

                if(flag==2)  

                {  

                    int flagg=strcmp(id[s[i]],id[s[j]]);  

                    if(flagg>0)  

                    {  

                        tmp=s[i];  

                        s[i]=s[j];  

                        s[j]=tmp;  

                    }   }  }  }   }  

    for(i=0;i<n;i++)  

    {  

        printf("%s\n",id[s[i]]);  

    }  

}  

背景:

    压缩是一种有效的减小数据量的方法,目前已经被广泛应用于各种类型的信息系统之中。

    一种压缩文本文件(假设文件中不包含数字)的方法如下:

    1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中;

    2. 原始文件中的词(全部由字母组成),如果是第一次出现,则将该词加入到一个词的列表中,并拷贝到压缩文件中;否则该词不拷贝到压缩文件中,而是将该词在词的列表中的位置拷贝到压缩文件中。

    3. 词的列表的起始位置为 1 。 词的定义为文本中由大小写字母组成的最大序列。大写字母和小写字母认为是不同的字母,即 abc 和 Abc 是不同的词。词的例子如下: x-ray 包括两个词 x 和 ray;mary's 包括两个词 mary 和 s;a c-Dec 包括三个词 a 和 c 和 Dec 编写一个程序,输入为一组字符串,输出为压缩后的文本。

输入:

    输入为一段文本,可以假设输入中不会出现数字、每行的长度不会超过 80 个字符,并且输入文本的大小不会超过 10M。

输出:压缩后的文本。

测试输入

期待的输出时间限制内存限制额外进程

测试用例 1

以文本方式显示

Please, please do it--it would please Mary very,↵

very much.↵

Thanks↵

以文本方式显示

Please, please do it--4 would 2 Mary very,↵

7 much.↵

Thanks↵

1秒

1024KB

0

 #include<stdio.h>    

    #include<string.h>    

        int main(){    

            int word=0,i=0,j=0,k=0,flag=1,m=0;    

            char s[500],words[10000][100],a[500];    

            for(i=0;i<10000;i++)    

               for(j=0;j<100;j++)    

                  words[i][j]='\0';    

            while(gets(a) != NULL){//得到一行    

                if('\0'==a[0]){printf("\n");continue;}//只有一个换行符,那就换行    

                //有意义的一行,初始化    

                for(i=0;a[i]!='\0';i++)s[i+1]=a[i];  

                s[0]='.';s[i+1]='\0';k=0; i=1;  

                while(s[i]!='\0'){//依次处理每个字符    

                   if((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')){    

                       //这是一个字母    

                       if(!((s[i-1]>='a' && s[i-1]<='z')||(s[i-1]>='A' && s[i-1]<='Z'))){  

                           word++;k=0;words[word][k++]=s[i];}//这是一个单词的开头    

                       else{words[word][k++]=s[i]; }//把这个字母放好了,干点儿别的  

                       if(!((s[i+1]>='a' && s[i+1]<='z')||(s[i+1]>='A' && s[i+1]<='Z'))){ //单词结束就审判  

                           words[word][k]='\0';    

                           flag=1;    

                           for(j=1;j<word;j++){    

                               if(!strcmp(words[j],words[word])){    

                                   printf("%d",j);    

                                   for(m=0;m<100;m++){words[word][m]='\0';}  

                                   word--;    

                                   flag=0;    

                                   break;    

                                 }    

                            }    

                            if(flag){printf("%s",words[word]);}}    

                   }else{    

                       putchar(s[i]);    

                   }i++;  }  

                printf("\n");  

                }      

            return 0;    

        }  

描述

Tom 和 Jerry 做猜数字的游戏,Tom 想一个数字然后让 Jerry 去猜,数字的范围在 1 到 10 之间。对于 Jerry 每讲的一个数,Tom 都要讲这个数是 too high 或者 too low 或者 right on,直到 right on 结束。为了防止 Tom 作弊,Jerry 把每一次的对话记录下来,现在让你去判断 Tom 有没有作弊。

输入

游戏可能做很多次,直到 Jerry 猜 0 的时候游戏结束,每一次猜测由一个正整数和一行回答组成。

输出

对每一次游戏如果 Tom 的回答有自相矛盾的地方,就输出 Tom is dishonest,否则输出 Tom may be honest。

#include<stdio.h>

#include<string.h>

int main(){

    int n,h,l;

    char ans[50];

    h=11;l=-1;

    while(scanf("%d",&n)){//得到猜的数字

        if(0 == n)break;//猜0的时候结束

        getchar(); //扫描换行

        gets(ans); //得到回答

        if(strcmp(ans,"too high") == 0){//回答是太高

            if(n < h) h=n;//更新上界h

        }else if(strcmp(ans,"too low") == 0){//回答太低

            if(n > l) l=n;//更新下界l

        }else if(strcmp(ans,"right on") == 0){//回答猜对了判断人品

            if(n > l && n < h) printf("Tom may be honest\n");

            else printf("Tom is dishonest\n");

            h=11;l=-1;//为新一轮初始化

        }

    }

    return 0;

}

题目背景

C语言课程开设以来,许多同学被各种WA,RE,TLE,MLE伤得欲哭无泪。

而YW大神,由于程序写得好,代码改的快,亲和又善良,纯洁又无害(此处省略1000字)不少同学纷纷找大神求改程序。

然而,其中某渣渣同学发来的代码处于:无换行无缩进无对齐的”三无状态”,令沉溺于SM(哦不,ACM)这种高水平的大神才能享受的比赛的大神头昏眼花,倍感心酸。

大神每次帮渣渣改程序都要耗费大量地精力和愉悦度(这是大神的HP与MP)来规范代码。(此处有哭声)

于是,作为大神的好基友大师,你决定写一个程序来将渣渣发来的程序自动“规范化”,以愉悦善良又可爱又机智又神牛的大神,让TA能够有足够的心情和时间去ACM的课程中虐人。(什么?你问大神为什么不写一个这样的程序? 答案是显然的,大神没有精力写这种简单的程序,当然要让大神的崇拜者大师来写。)

活泼的PS: 大家写代码要注意规范哦~~~不然大神哭给你看呜呜呜呜……

自己改错是一个好习惯~~可以从改错误收获很多~

大神还要去虐校赛地区赛各种赛呢~

那么~ 什么是「规范化」捏?

  1. 所有语句按层次缩进,每个缩进为4个空格(参见样例);
  2. 花括号必须独占一行,同层次括号必须对齐;
  3. 每行只能存在一个带有分号的语句(for(;;)循环中的分号不算);
  4. for语句独占一行;
  5. 若不需进行「规范化」则原样输出(例#include<stdio.h>)。

鉴于渣渣同学的水平(= =),我们假定渣渣的代码中不存在注释,不存在for和if语句的嵌套,也不会存在一些奇葩语句。if语句不会有else,for循环的结构体保证有大括号{}包围。虽然渣渣的代码没有缩进,但时不时会有一些换行。

题目作者

     大师,渣渣(2012级实验学生提供)

 

测试输入

期待的输出时间限制内存限制额外进程

测试用例 1

以文本方式显示

  1. #include<stdio.h>↵
  2. int main(){printf("Orz Dashen!");return 0;}↵

以文本方式显示

  1. #include<stdio.h>↵
  2. int main()↵
  3. {↵
  4.     printf("Orz Dashen!");↵
  5.     return 0;↵
  6. }↵

无限制

64M

0

测试用例 2

以文本方式显示

  1. #include<stdio.h>↵
  2. int main()↵
  3. {↵
  4. int rp=100000;{{{printf("Orz Dashi");}rp+=1000000;}}↵
  5. return 50;}↵

以文本方式显示

  1. #include<stdio.h>↵
  2. int main()↵
  3. {↵
  4.     int rp=100000;↵
  5.     {↵
  6.         {↵
  7.             {↵
  8.                 printf("Orz Dashi");↵
  9.             }↵
  10.             rp+=1000000;↵
  11.         }↵
  12.     }↵
  13.     return 50;↵
  14. }↵

无限制

64M

0

测试用例 6

以文本方式显示

  1. #include<stdio.h>↵
  2. int rp=0;void orz()↵
  3. {↵
  4. int i,j;↵
  5. for(i=1;i<=1000;i++){rp++;}for(j=1;j<=1000;j++){rp+=j;}}↵
  6. int main()↵
  7. {orz();printf("%d",rp);}↵

以文本方式显示

  1. #include<stdio.h>↵
  2. int rp=0;↵
  3. void orz()↵
  4. {↵
  5.     int i,j;↵
  6.     for(i=1;i<=1000;i++)↵
  7.     {↵
  8.         rp++;↵
  9.     }↵
  10.     for(j=1;j<=1000;j++)↵
  11.     {↵
  12.         rp+=j;↵
  13.     }↵
  14. }↵
  15. int main()↵
  16. {↵
  17.     orz();↵
  18.     printf("%d",rp);↵
  19. }↵

无限制

64M

0

    #include<stdio.h>  

    #include<ctype.h>  

    char a[10000];int sj;  

    void dayinsj(int i);  

    int main(){  

        int len,flag=0,i;char c;  

        while((c=getchar())!=EOF){  

            if(c=='\n'){continue;}  

            a[i]=c;i++;            //获得输入  

        }  

        len = i;  

        for(i = 0;i<len;i++){  

            if(a[i]=='>'){putchar(a[i]);putchar('\n');//到了链接库之后,换行  

            }else if(a[i]=='{'){//一个语句块的开始  

                putchar('\n');//它要在单独的一行  

                dayinsj(sj);//且要缩进  

                putchar(a[i]);//把它打印出来  

                putchar('\n');//单独一行的单独  

                sj++;//后面的内容要增加缩进  

                dayinsj(sj);//缩进  

            }else if(a[i]=='f'&&a[i+1]=='o'&&a[i+2]=='r'){//for循环  

                putchar(a[i]);flag=2;//标记有两次不换行的;号  

            }else if(a[i]=='}'){//一个语句块的结束  

                if(a[i-1]==';'&&a[i+1]!='}'){//之前是分号,自己完成换行缩进。之后不是},换行缩进  

                    putchar('\n');sj--;dayinsj(sj);putchar(a[i]);putchar('\n');dayinsj(sj);  

                }else if(a[i-1]==';'&&a[i+1]=='}'){//之前是分号,之后有},让下一个自己看着办  

                    putchar('\n');sj--;dayinsj(sj);putchar(a[i]);  

                }else if(a[i-1]=='}'&&a[i+1]=='}'){//自己看着办  

                    putchar('\n');sj--;dayinsj(sj);putchar(a[i]);  

                }else if(a[i-1]=='}'&&a[i+1]!='}'){  

                    putchar('\n');sj--;dayinsj(sj);putchar(a[i]);putchar('\n');dayinsj(sj);  

                }  

            }else if(a[i]==';'){  

                if(flag==0){//不是for循环  

                   if(a[i+1]=='}'){//这是语句块的结尾  

                      putchar(a[i]);//剩下的让}自己去做吧  

                   }else{//普通语句结束  

                      putchar(a[i]);putchar('\n');dayinsj(sj);  

                   }  

                }else{putchar(a[i]);flag--;}//是for循环  

            }else{putchar(a[i]);}//其他内容没有特殊要求  

        }  

        return 0;  

    }  

    void dayinsj(int i){  

        int j=0;  

        if(i){  

            for(j=0;j<i;j++) printf("    ");  

        }  

    }  

//递归求平方根

#include<stdio.h>

#include<math.h>                          

double Sqrt(double x,double p,double e);

int main(){

    double x,e,p;

    scanf("%lf\n%lf",&x,&e);

    p=0.5*x;

    printf("%.8lf\n",Sqrt(x,p,e));

    return 0;

}

double Sqrt(double x,double p,double e){

    if(fabs(p*p-x)<e){return p;}

    else{return Sqrt(x,0.5*(p+x/p),e);}

}

//递归求最大公约数

#include <stdio.h>  

#include<stdio.h>

int gcd(int n,int m);                    

int main( ){  

    int m,n;

    scanf("%d %d",&n,&m);

    printf("%d\n",gcd(m,n));

    return 0;  

}  

int gcd(int n,int m){

    if(m<=n&&0==n%m){return m;}//后面的小,且大的是小的的整数倍,那小的就是结果

    if(n<m){return gcd(m,n);}//前面的小,交换位置

    else{return gcd(m,n%m);}

}

//采用指针对数组进行排序

#include <stdio.h>  

#include <stdlib.h>  

char *resort(char *a);  

int main(int argc, char *argv[]) {  

         

    char a[100];  

    gets(a);  

    puts(resort(a));  

    return 0;  

}  

char *resort(char *a){                              

    char temp;char *i;char *j;

    for(i=a;*i!='\0';i++){

        for(j=i+1;*j!='\0';j++){

            if(*j<*i){temp=*i;*i=*j;*j=temp;}

        }

    }

return a;

}

//快速排序算法的实现

//快速排序函数:要求:输入数组左右两端位置,将数组定义为全局变量在此函数中叫a

void quicksort(int left,int right);

void quicksort(int left,int right){

    int i,j,temp,t;

    if(left>right) return;

    temp = a[left];i = left;j = right;

    while(i != j){

        while(a[j] >= temp && i < j) j--;

        while(a[i] <= temp && i < j) i++;

        if(i < j){

            t = a[i];a[i] = a[j];a[j] = t;

        }

    }

    a[left]=a[i];a[i]=temp;

    quicksort(left,i-1);

    quicksort(i+1,right);

}

题目描述

欢迎参加程序设计竞赛~

程序设计竞赛中有着很多有意思的问题,其中,与三角形有关的问题就经常出现。今天你要解决的,就是其中最简单的一个问题:

给定平面直角坐标系上的N个点,保证这N个点中任意三点都不共线。求任意三点能够构成的三角形中,面积最大的三角形的面积。

输入

输入的第一行是一个整数T(1 <= T <= 10),表示一共有T组用例。

每组用例的第一行为一个整数N(3 <= n <= 100),表示平面上点的个数。接下来的N行,每行包含两个用空格隔开的整数Xi和Yi(-1000 <= Xi, Yi <= 1000),表示第i个点的坐标(Xi, Yi)。

输出

每组用例输出一个数,表示最大的三角形的面积,结果保留一位小数。

#include <stdio.h>    

int main(int argc, char *argv[]) {          

    int x[102],y[102];      

    int i=0,k=0,j=0,t,n;double a=0,max=0;

    scanf("%d",&t);                      

    for(t;t;t--){

        scanf("%d",&n);max=0;              

        for(i=0;i<n;i++){

            scanf("%d %d",&x[i],&y[i]);                          

        }

        for(i=0;i<n;i++){

            for(j=0;j<n;j++){

                for(k=0;k<n;k++){

                    a=(x[i]-x[j])*(y[k]-y[j])-(x[k]-x[j])*(y[i]-y[j]);

                    if(a<0) a*=(-1);

                    a/=2.0;

                    if(a>max) max=a;                    

                }

            }

        }

        printf("%.1lf\n",max);

    }      

    return 0;  

}  

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值