@okokme
2018-07-25T12:17:11.000000Z
字数 6935
阅读 696
c语言
---emmm做个记录,虽然是水题,也有一些要注意到的点,留个痕迹吧~
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
对于每组输入数据,输出一行,字符中间用一个空格分开。
qwe
asd
zxc
e q w
a d s
c x z
#include<stdio.h> //关键是把输入后的回车过滤掉
//三个字母直接定义成三个变量利于操作,不用使用数组了
int main()
{
char a,b,c;
char t;
while((a= getchar())!=EOF) //注意这里要在EOF前加括号!!!
{
b=getchar();
c=getchar();
getchar(); //过滤回车
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
printf("%c %c %c\n",a,b,c);
}
return 0;
}
在此插入一个小问题
C语言printf("%d",15.0/2)结果为0
原来是因为printf不会执行类型转换。
printf调用时,将参数入栈,最后只能看到栈顶的参数,就是printf的第一个参数,然后解析这个字符串,再去栈里挨个找参数,比如printf("%d%d\n", a,b);解析字符串,看到%d时,那么先从栈顶向下偏移一个字符串指针的长度,就是整形数int的位置了,从栈里当前指针的位置到sizeof(int)里边保存的就是这个int a的值了,然后继续解析字符串,看到%f,再去栈中a的上边找一个sizeof(double)的长度,就是double f的值了。
这里计算出来其实已经是double类型了,将double类型入栈,根据计算机组成原理上double类型存储,7.5转换成16进制是0x401e000000000000
在内存中应该是所以printf输出%d是指针只是下移32位,所以结果为0 。%lf输出的才是double7.5.。如果输出%lld,则将这些16进制看成无符号整数,结果为4620130267728707584。和内存存储有关。
————————————————————————————————————————————————————————————
根据输入的半径值,计算球的体积。
输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。
输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。
1
1.5
4.189
14.137
#define PI 3.1415927
#include<stdio.h>
#include<math.h>
#define PI 3.1415927
int main()
{
double r;
while((scanf("%lf",&r)!=EOF))
{
printf("%.3lf\n",PI*r*r*r*4.0/3.0); //做题时用到float,double数据型计算时,乘除用小数如4.0,3.4等
}
return 0;
}
这道题比较简单,,不用float,float(33.3333总共6位)。
2.在对浮点型常量进行运算时,应该对整数数字也化为小数运算。
————————————————————————————————————————————————————————————
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。
如果一个字符串是回文串,则输出"yes",否则输出"no".
4
level
abcde
noon
haha
yes
no
yes
no
#include<stdio.h>
#include<string.h>
int main()
{
int n,large;
int i,j;
char a[100]; //第一次在这里出错,理由是我写的a[10]空间过于小,在其后进行后台其他字符串测试时,溢出出错
int flag;
scanf("%d",&n);
for(i=0; i<n; i++)
{
flag=0; //一定要注意在有++的循环中最开始初始化
scanf("%s",a);
large=strlen(a);
for(j=0;j<large/2; j++)
{
if(a[j]==a[large-1-j])
flag++;
}
if(flag==large/2)
printf("yes\n");
else
printf("no\n");
}
}
此题难度不大,但是要注意:
1.字符数组定义长度不能太短。
2.注意在有自加运算++的地方一定要在循环中开始的地方初始化。!!!
————————————————————————————————————————————————————————————
给定两个正整数,计算这两个数的最小公倍数。
输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.
对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。
10 14
70
#include<stdio.h>
int fun(int a,int b)
{
int t;
int d;
if(b>a)
{
t=a;
a=b;
b=t;
}
while(b!=0)
{
d=b;
b=a%b;
a=d;
}
return a;
}
int main()
{
int a,b;
int n;
while((scanf("%d %d",&a,&b))!=EOF) //没事干别老给while 后乱加分号
{
// scanf("%d %d",&a,&b);
n=a*b/fun(a,b);
printf("%d\n",n);
}
return 0;
}
此题为经典最小公倍数题,要注意的是:
1.最大公因数的算法。
2.没事别乱在while后加分号,很难找错...
————————————————————————————————————————————————————————————
输入的数据中,第一行是一个整数 N , 接下来有 N 行,每行首先有一个字符
op,然后是两个用空格分隔的正整数 a 和 b。
数据范围:
(1) 0 < N < 1000, 0 < a, b < 10000;
(2) op ∈ { '+', '-', '*', '/' }
对于每一行数据,输出 a op b 的值,若这个值不是一个整数,则保留两位
小数。 每组数据占一行。
4
+ 1 2
- 1 2
* 1 2
/ 1 2
3
-1
2
0.50
#include<stdio.h>
int main()
{
int n;
float a,b;
char op;
float num;
int i;
scanf("%d",&n);
getchar();
if(n>0 && n<1000)
{
while(n--)
{
scanf("%c",&op);
scanf("%f %f",&a,&b);
if( (a>0 && a<10000) && (b>0 && b<10000))
{
getchar(); //在输入回车与%c 或者 c=getchar() 循环碰撞时要注意加getchar()过滤掉回车
if(op == '+')
printf("%.0f\n",a+b);
if(op == '-')
printf("%.0f\n",a-b);
if(op == '*')
printf("%.0f\n",a*b);
if(op == '/')
{
if((int)(a/b) == a/b)
{
printf("%.0f\n",a/b);
}
else
{
num = a/b;
printf("%.2f\n",num);
}
}
}
else
{return 0;}
}
}
return 0;
}
此题为简单的计算器要注意的有:
1.如何判断一个数是否为整数
用int强制类型转换把要转换的那个数定义成整形,如果他们还相等,说明是整数。
例如:a=2.1
判断 (int)a == a
2 ?= 2.1
2.遇到scanf("%c",&ch); 或 ch=getchar();时要格外注意是否会让上面输入的回车占据这个字符。 记得输入后用getchar()消除回车。
3.注意范围
4.。。。待定找不出bug但就是。。。accept不了
————————————————————————————————————————————————————————————
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。
对于每个测试实例,输出插入新的元素后的数列。
3 3
1 2 4
0 0
1 2 3 4
#include<stdio.h>
int main()
{
int m,n;
int i;
int t;
int flag=0;
while(scanf("%d %d",&n,&m) && (n!=0 || m!=0))// ||
{
flag=0;
if(n==0) //注意n为0的情况
printf("%d\n",m);
for(i=0; i<n; i++)
{
scanf("%d",&t);
if(t<m || flag==1) // ||
printf("%d",t);
else
{
printf("%d %d",m,t);
flag=1;
}
if(i!=n-1);
printf(" ");
}
printf("\n");
}
}
此题没有用数组储存数再挨个比较数组后移,而是用的直接输入变量临时存储直接比较输出的方法。不需遍历直接比较输出,较为便捷。
注意:
1.代码中的 || 与 && 运算符使用时候的条件与区别。
2.要将所有结果都考虑进去
C语言
1.标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线。例如,正确的标识符:abc,a1,prog_to。
2.不能把C语言关键字作为用户标识符,例如if ,for, while等.标识符长度是由机器上的编译系统决定的,一般的限制为8字符(注:8字符长度限制是C89标准,C99标准已经扩充长度,其实大部分工业标准都更长)。
2.标识符对大小写敏感,即严格区分大小写。一般对变量名用小写,符号常量命名用大写。
标识符命名应做到“见名知意”,例如,长度(外语:length),求和、总计(外语:sum),圆周率(外语:pi)……
4.C语言中把标识符分为三类:关键字,预定义标识符,用户自定义标识符。
在编程语言中,标识符就是程序员自己规定的具有特定含义的词,比如类名称,属性名称,变量名等。
输入一个字符串,判断其是否是C的合法标识符。
输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。
对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。
3
12ajf
fi8x_a
ff ai_2
no
yes
no
给定三条边,请你判断一下能不能组成一个三角形。
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C。其中A,B,C <1000;
对于每个测试实例,如果三条边长A,B,C能组成三角形的话,输出YES,否则NO。
2
1 2 3
2 2 2
NO
YES
#include<stdio.h>
int add(float a,float b,float c)
{
if( (a+b)>c )
return 1;
else
return 0;
}
int less(float a, float b, float c)
{
if( (a-b)<c)
return 1;
else
return 0;
}
int main()
{
int n;
float a,b,c;
scanf("%d",&n);
while(n--)
{
scanf("%f %f %f",&a,&b,&c);
if(add(a,b,c) && add(a,c,b) && add(b,c,a) && less(a,b,c) && less(a,c,b) && less(b,c,a))
{
printf("YES\n");
}
else
printf("NO\n");
}
}
此题没有难度,但是要注意三角形的边可以是小数,不要看见输入的数字全是整数就写成int型,应写成float型。这里很容易 Wrong Answer。
————————————————————————————————————————————————————————————
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000 ;
Output
对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
Sample Input
2
220 284
100 200
Sample Output
YES
NO
#include<stdio.h>
int fun(int m)
{
int sum=0;
int i;
if(m<=0)
return 0;
else if(m==1)
return 1;
else
{
for(i=1; i<m; i++)
{
if(m%i==0)
sum+=i;
}
return sum;
}
}
int main()
{
int n;
int a,b;
int p,q;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&a,&b);
p=fun(a);
q=fun(b);
if(p==b && q==a)
printf("YES\n");
else
{
printf("NO\n");
}
}
}
注意:
就是求出因子相加。注意求因数时数据的范围判断的全面性。
————————————————————————————————————————————————————————————
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<=50),判定该表达式的值是否都为素数。
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
0 1
0 0
OK
J题与K题的算法是互通的,相当于用的是一套模版...但是此题WrongAnswer还没找出来...
注意:
acm下函数返回值直接与数值比较好像不太行(如fun(temp)==-1)先赋给其他变量再比较吧。
输入一个英文句子,将每个单词的第一个字母改成大写字母。
输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。
请输出按照要求改写后的英文句子。
i like acm
i want to get an accepted
I Like Acm
I Want To Get An Accepted
#include<stdio.h>
int main()
{
char ch;
int flag=0;
int p=0;
while((ch = getchar())!= EOF)
{
p++;
if(p == 1)
flag=1;
if(flag == 1)
printf("%c",ch-32);
else if(flag == 0)
printf("%c",ch);
if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
flag=0;
else if(ch == '\n' || ch == ' ')
flag=1;
}
}
与G-数字序列输出做法同理,不需要每个字符储存完成后再输出,可以输入一个字符判断完成后输出再判断下一个,因为是文件为文件看结果就可以啦
————————————————————————————————————————————————————————————