//求最大素数
#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: 大家写代码要注意规范哦~~~不然大神哭给你看呜呜呜呜……
自己改错是一个好习惯~~可以从改错误收获很多~
大神还要去虐校赛地区赛各种赛呢~
那么~ 什么是「规范化」捏?
- 所有语句按层次缩进,每个缩进为4个空格(参见样例);
- 花括号必须独占一行,同层次括号必须对齐;
- 每行只能存在一个带有分号的语句(for(;;)循环中的分号不算);
- for语句独占一行;
- 若不需进行「规范化」则原样输出(例#include<stdio.h>)。
鉴于渣渣同学的水平(= =),我们假定渣渣的代码中不存在注释,不存在for和if语句的嵌套,也不会存在一些奇葩语句。if语句不会有else,for循环的结构体保证有大括号{}包围。虽然渣渣的代码没有缩进,但时不时会有一些换行。
题目作者
大师,渣渣(2012级实验学生提供)
| 测试输入 |
期待的输出时间限制内存限制额外进程
测试用例 1 |
|
| 无限制 | 64M | 0 |
测试用例 2 |
|
| 无限制 | 64M | 0 |
测试用例 6 |
|
| 无限制 | 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;
}