C语言编程经验总结:
1.求某一整数的十位,先取余再除以10。
2.求某一整数字符串各位之和,可以使用-'0'操作。
#include
#include
#include
int main(){
char s[100000];
int i,sum=0;
scanf("%s",&s);
i=strlen(s);
for(int j=0;j sum+=s[j]-'0';
}
printf("%d",sum);
return 0;
}
本题输入123,输出6.
3.求一个三位数的反序。
#include
int main(){
int n;
scanf("%d",&n);
printf("%d%d%d",n%10,n/10%10,n/100);
return 0;
}
本题输入120,输出021.
4.对一个小数上下取整。
#include
int main(){
float n;
scanf("%f",&n);
if(n==(int)n)
{
printf("%d\n",(int)n);
printf("%d\n",(int)n);
}
else
{
printf("%d\n",(int)n);
printf("%d\n",(int)n+1);
}
return 0;
}
5.注意浮点数的范围,对于小于100000的数应定义为double类型的数据。
#include
int main(){
double f;
scanf("%lf",&f);
printf("%.3lf\n",5.0/9*(f-32));
return 0;
}
本题是输入华氏温度,输出对应的摄氏温度。
6.求某个数的四舍五入值。
12345->12350
12399->12400
#include
int main(){
int n,m;
scanf("%d",&n);
if(n%10>=5)
{
m=n+10-n%10;
}
else
{
m=n-n%10;
}
printf("%d\n",m);
return 0;
}
7.判断闰年。
#include
int main(){
int year;
scanf("%d",&year);
if((year%4==0&&year%100!=0)||(year%400==0)){
printf("yes\n");
}
else{
printf("no\n");
}
return 0;
}
8.数列求和。
链接:https://ac.nowcoder.com/acm/problem/22158
输入一个整数n,计算 1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...+2n-1)的值。
#include
int main(){
int n;
double sum=0,s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(i%2==1)
{
s+=2*i-1;
}
else
{
s-=2*i-1;
}
sum+=1.0/s;
}
printf("%.3f\n",sum);
return 0;
}
输入1,输出1.000。
9.数列求和。
计算1+(1+2)+(1+2+3)+。。。+(1+2+3+。。。+n)。
#include
int main(){
int n,sum=0,s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
s=i*(i+1)/2;
sum+=s;
}
printf("%d\n",sum);
return 0;
}
输入4,输出20。
10.斐波那契数列递归方式实现。
#include
int fib(int n);
int main(){
int n;
scanf("%d",&n);
printf("%d\n",fib(n));
return 0;
}
int fib(int n){
int s;
if(n==1||n==2) s=1;
else{
s=fib(n-1)+fib(n-2);
}
return s;
}
前几项是1,1,2,3,5,8。。。
输入2,输出1。
11.有一个数字魔法,给你一个正整数n,如果n为偶数,就将他变为n/2, 如果n为奇数,就将他变为乘3加1,不断重复这样的运算,经过有限步之后,一定可以得到1。
输入一个整数,输出一个整数表示第几次计算能变成1。
#include
int main(){
int n,sum=0,i=0;
scanf("%d",&n);
while(n!=1){
i++;
if(n%2==0) n=n/2;
else n=3*n+1;
}
printf("%d\n",i);
return 0;
}
输入3,输出7。
12.利用更相减损术求两个整数的最大公约数,即每次将较大的数变成大数减去小数的值。
#include
int main(){
int m,n;
scanf("%d %d",&m,&n);
while(m!=n){
if(m>n) m=m-n;
else if(m
}
printf("%d\n",m);
return 0;
}
输入4 6,输出2。
13.计算a+b,输入包含多组数据,每组输入占一行。
#include
int main(){
int m,n;
while(scanf("%d%d",&m,&n)!=EOF){
printf("%d\n",m+n);
}
return 0;
}
14.计算a+b,当输入的两个整数都是0时结束。
注意使用while(1)。
#include
int main(){
int m,n;
while(1){
scanf("%d %d",&m,&n);
if(m!=0&&n!=0) printf("%d\n",m+n);
else break;
}
return 0;
}
输入1 1
2 3
0 0
输出2
5
15.输入两个整数a,b,求这两个数之间位数之和为5的数的个数。
方法一:
#include
int main(){
int m,n;
scanf("%d %d",&m,&n);
int max,min,j=0;
max=m>n?m:n;
min=m
for(int i=min;i<=max;i++){
int temp=i;
while(temp!=0){
s+=temp%10;
temp/=10;
}
if(s%5==0)
j++;
s=0;//注意每次计算结束需要将位数和S归零
}
printf("%d\n",j);
return 0;
}
输入10 20,输出2,因为10-20有两个数符合要求:14和19。
方法二(封装函数的方法):
#include
int fun(int k)
{
int i,a[10],sum=0;
for(i=0;k>0;i++)
{
a[i]=k%10;
k/=10;
sum+=a[i];
}
return sum;
}
int main()
{
int x,y;
int i,s=0;
scanf("%d %d",&x,&y);
for(i=x;i<=y;i++)
{
if(fun(i)%5==0)
s+=1;
}
printf("%d",s);
return 0;
}
16.输出回文数:正着读与倒着读都一样的数。比如1221,343是回文数。
方法一:
#include
int main()
{
int n,i,j,t=0;
scanf("%d",&n);
for(i=1,j=1;j
i=j;
while(i!=0)
{
t=t*10+i%10;
i=i/10;
}
if(t==j) printf("%d\n",j);
t=0;
}
return 0;
}
方法二(封装函数的方法):
#include
int nizhi(int k)
{
int a[10],i,j,sum=0;
for(i=0;k>0;i++)
{
a[i]=k%10;
k/=10;
}
for(j=0;j<=(i-1);j++)
{
sum=a[j]+sum*10;
}
return sum;
}
int main()
{
int n;int i,s;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if(i==nizhi(i))
printf("%d\n",i);
}
return 0;
}
输入10,输出1 2 3 4 5 6 7 8 9(一个数一行)。
17.输出1~n中能被3整除,并且至少有一位数字是5的所有整数。
#include
int main(){
int n,x=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(i%3!=0)
continue;
int temp=i;
while(temp!=0){
x=temp%10;
if(x==5){
printf("%d\n",i);
break;
}
temp/=10;
}
}
return 0;
}
输入50,输出15
45
18.选村长。投票一人一票,为候选人a,b,c投票,代号分别为1,2,3,其他投票均无效,以-1结束,分别统计他们的得票数。谁的票数超过全部投票人数的一半,就输出谁当选为村长,如果都不过半,则输出“all-NO”。
#include
int main(){
int n,a=0,b=0,c=0,Tot=0,count=0;
while(scanf("%d",&n)!=EOF){
count++;
if(n==-1) break;
switch(n){
case 1:
a++;
Tot++;
break;
case 2:
b++;
Tot++;
break;
case 3:
c++;
Tot++;
break;
default:
break;
}
}
printf("A=%d\n",a);
printf("B=%d\n",b);
printf("C=%d\n",c);
printf("Tot=%d\n",Tot);
//printf("A=%d\nB=%d\nC=%d\nTot=%d\n",a,b,c,count);
if(a
else if(a>=count/2)
printf("A-yes\n");
else if(b>=count/2)
printf("B-yes\n");
else
printf("C-yes\n");
return 0;
}
输入1 1 3 2 1 3 2 1 3 3 1 2 4 1 4 1 2 1 2 1 1 -1
输出A=10
B=5
C=4
Tot=19
all-NO
19.输入一个整数,输出这个整数的所有数位之和。
#include
int main(){
int n,sum=0;
scanf("%d",&n);
while(n!=0){
int i=n%10;
n/=10;
sum+=i;
}
printf("%d\n",sum);
return 0;
}
输入12,输出3。
20.素数判断。输入一个整数,判断是否是素数,输出“Yes”或“No”。
#include
int main(){
int t,flag=1;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
if(n==1){
printf("No\n");
continue;
}
if(n==2){
printf("Yes\n");
continue;
}
for(int i=2;i
{
printf("No\n");
flag=0;
break;
}
}
if(flag==1) printf("Yes\n");
flag=1;
}
return 0;
}
输入2
1
2
输出No
Yes
21.输入一个字符串,包含整数、数字和其他字符,字符串以“?”结束。计算数字、字母及其他字符的个数。
方法一:
#include
int main()
{
int Letters=0,Digits=0,Others=0;
char s ;
while(s=getchar(),s!='?'){
if(s<='9'&&s>='0'){
Digits++;
continue;
}
else if((s>='a'&&s<='z')||(s>='A'&&s<='Z')){
Letters++;
continue;
}
else{
Others++;
}
}
printf("Letters=%d\nDigits=%d\nOthers=%d\n",Letters,Digits,Others);
return 0;
}
方法二(利用ASCII码值,a-z:97-122,A-Z:65-90):
#include
int main()
{
int Letters=0,Digits=0,Others=0;
char s ;
while(s=getchar(),s!='?'){
if(s>47&&s<58){
//'0'的ASCII码值为48
Digits++;
continue;
}
else if((s>64&&s<91)||(s>96&&s<123)){
//'A'的ASCII码值是65,'a'的ASCII码值是97
Letters++;
continue;
}
else{
Others++;
}
}
printf("Letters=%d\nDigits=%d\nOthers=%d\n",Letters,Digits,Others);
return 0;
}
注:空格也是一个字符。
输入ab123!?
输出Letters=2
Digits=3
Others=1
22.注:EOF 是个宏,其意思是:End Of File,文件尾标志。 从数值上来看,就是整数-1。linux系统下,在输入回车换行后的空行位置,按 ctrl+d (先按ctrl键,不放,再按d键)。windows系统下,在输入回车换行后的空行位置,按 ctrl+z,再回车确认。
23.输入一个整数,输出这个整数行大小的金字塔。多个测试数据,每个测试数据输入一个整数。
#include
int main(){
int n,i,j;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++){
for(j=1;j<=n-i;j++)
{
printf(" ");
}
for(j=1;j<=2*i-1;j++)
{
printf("*");
}
printf("\n");
}
}
return 0;
}
输入1
3
输出*
*
* *
* * *
24.输出双层金字塔。多个测试数据。
#include
int main(){
int n,i,j;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++){
for(j=1;j<=n-i;j++)
{
printf(" ");
}
for(j=1;j<=2*i-1;j++)
{
printf("*");
}
printf("\n");
}
for(i=1;i<=n-1;i++){
for(j=1;j<=i;j++)
{
printf(" ");
}
for(j=1;j<=2*(n-i)-1;j++)
{
printf("*");
}
printf("\n");
}
}
return 0;
}
输入2
5
输出 *
***
*
*
***
*****
*******
*********
*******
*****
***
*
拓展:打印字符金字塔。输入一个字母,保证是大写,输出一个字母金字塔。
#include
void jzt(char ch);
int main(){
char ch;
ch=getchar();
jzt(ch);
return 0;
}
void jzt(char ch){
char i,j,k;
for(i='A';i<=ch;i++){
for(j=ch;j>i;j--)
printf(" ");
for(k='A';k<=i;k++)
printf("%c",k);
for(k=i-1;k>='A';k--)
printf("%c",k);
printf("\n");
}
}
输入C
输出 A
ABA
ABCBA
25.阶乘输出。计算S=1!+2!+3!+…+N!的值。
#include
int main(){
int n,a=1,s=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
a*=i;
s+=a;
}
printf("%d\n",s);
return 0;
}
输入2,输出3。
26.九九乘法表打印输出。
#include
int main(){
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
printf("%d*%d=%2d ",j,i,i*j);
}
printf("\n");
}
return 0;
}
1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
27.打印数字三角形,从1开始输出,第i行输出i个数,每个数字按4个位置输出
注:c语言中 %4d可以输出一个数,占据四个位置,右对齐。
#include
int main(){
int n,k=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
k++;
printf("%4d",k);
}
printf("\n");
}
return 0;
}
输入4
输出
1
2 3
4 5 6
7 8 9 10
28.将输入的整数逆序打印输出。
#include
int nixu(int n);
int main(){
int n;
scanf("%d",&n);
printf("%d\n",nixu(n));
return 0;
}
int nixu(int n){
int s=0,i;
while(n!=0){
i=n%10;
s=s*10+i;
n/=10;
}
return s;
}
输入12345,输出54321。
29.打印回文对称数。输入一个整数n,从1开始按从小到大的顺序输出所有回文数。
#include
int nixu(int n);
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int s=nixu(i);
if(s==i)
printf("%d\n",s);
}
return 0;
}
int nixu(int n){
int s=0,i;
while(n!=0){
i=n%10;
s=s*10+i;
n/=10;
}
return s;
}
输入10,输出1 2 3 4 5 6 7 8 9(每个整数占一行)。
30.打印质数。输入一个整数n,输出其所包含的所有质数,以空格隔开。
#include
int primes(int n){
int i;
for(i=2;i<=n;i++){
if(n%i==0) break;
}
if(i==n) return 1;
else return 0;
}
int main(){
int n;
scanf("%d",&n);
for(int j=1;j<=n;j++){
if(primes(j)==1)
printf("%d ",j);
}
return 0;
}
输入20
输出2 3 5 7 11 13 17 19
31.已知斐波那契数列的前几项0 1 1 2 3 5 8...,求第n项。
#include
int main(){
long long int n,i,f1,f2,f3;
f1=0;
f2=1;
scanf("%lld",&n);
if(n==1) printf("lld\n",f1);
else if(n==2) printf("lld\n",f2);
else
{
for(i=3;i<=n;i++){
f3=f1+f2;
f1=f2;
f2=f3;
}
printf("%lld\n",f3);
}
return 0;
}
输入49,输出4807526976。
32.输入5行(一个5*5的矩阵),以空格隔开,数据中只有一个是1,求这个1到矩阵中心的距离,即需要几步可以到达矩阵的中心位置。
注:矩阵中心为第三行第三列。
#include
#include
int main(){
int a[5][5],m,n;
for(int i=0;i<5;i++){
for(int j=j=0;j<5;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==1)
{
m=i;
n=j;
}
}
}
int s;
s=abs(m-2)+abs(n-2);
printf("%d\n",s);
return 0;
}
输入0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
输出3。
33.输入一个整数表示总像素,输出长和宽,使得长和宽接近,且长始终大于宽。
#include
#include
int main(){
int n,i,j;
scanf("%d",&n);
for(i=sqrt(n);i>=1;i--){
if(n%i==0)
{
j=n/i;
break;
}
}
printf("%d %d\n",i,j);
return 0;
}
输入8
输出2 4。
34.输入一行,三个整数a,b,c,如果某数目的a加上某数目的b之和等于c,则输出“Yes”,否则输出“No”。
#include
int main(){
int a,b,c,flag=1;
scanf("%d %d %d",&a,&b,&c);
int i,j;
for(i=0;i<=c/a;i++){
if((c-i*a)%b==0){
flag=0;
printf("Yes\n");
break;
}
}
if(flag==1) printf("No\n");
return 0;
}
输入3 2 7
输出Yes。
35.求两个整数的最大公约数。
方法一(非递归):
#include
int gcd(int a,int b){
while(b){
int temp=b;
b=a%b;
a=temp;
}
return a;
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}
方法二(递归):
#include
int gcd(int a,int b){
if(b==0) return a;
else
return gcd(b,a%b);
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}
输入4 6
输出2。
36.类似栈数的先进后出顺序,将输入的多组数据反向输出。
#include
int main(){
int n,a;
scanf("%d",&n);
while(n--){
scanf("%d",&a);
int s[a];
for(int i=0;i scanf("%d",&s[i]);
}
for(int j=a-1;j>=0;j--){
printf("%d ",s[j]);
}
printf("\n");
}
return 0;
}
输入
2
3
1 2 3
5
2 3 1 4 5
输出3 2 1
5 4 1 3 2
37.输入三行。第一行输入两个数,表示两个数组中数的个数,第二三行输入数组值。输出两个数组中最大数的和。
#include
int main(){
int n,m;
scanf("%d %d",&n,&m);
int a[n],b[m],x=0,y=0;
for(int i=0;i
if(x }
for(int j=0;j
if(y }
printf("%d\n",x+y);
return 0;
}
输入
2 3
1 2
1 2 3
输出
5
38.定位查找。多组测试,每次测试,第一行输入1个整数n,第二行输入n个整数,第三行输入1个整数m,输出m在该数组中的下标。
#include
int main(){
int m,n,i,j,a[20];
while(scanf("%d",&n)!=EOF){
for(i=0;i
}
scanf("%d",&m);
for(j=0;j
printf("%d\n",j);
break;
}
}
if(j==n) printf("No\n");
}
return 0;
}
输入
3
4 5 6
5
4
2 2 2 2
2
输出1 0
39.多个测试数据每个测试数据占一行,先输入分数的个数n,然后输入n个整数,计算平均值,打印输出小于平均值的数。
#include
int main(){
int n,score[100],i,sum;
double mean;
while(scanf("%d",&n)!=EOF){
sum=0;//每次都需要将sum清零
for(i=0;i
sum+=score[i];
}
mean=sum*1.0/n;
for(i=0;i
}
printf("\n");
}
return 0;
}
输入3 40 50 60
2 90 80
5 10 10 90 80 80
输出40
80
10 10
40.输入n个数,有一个数出现次数超过一半,输出这个数。
#include
int main(){
int n,a[1000],b[1000],i,j;
scanf("%d",&n);
for(int i=0;i
}
for(i=0;i
}
for(i=0;i
b[j]++;
}
}
}
for(i=0;i
}
printf("%d\n",a[i]);
return 0;
}
输入5
1 2 2 3 2
输出2。
***41.统计一篇英文中所有小写字母各出现了几次。
输入若干行,处理到结尾。按字符顺序输出每种小写字符的出现次数,没有出现的不用输出。
#include
int main(){
int i,j,s[1000]={0};
char ch,n;
while(scanf("%c",&n)!=EOF){
if(n>='a'&&n<='z'){
s[n]++;
}
}
for(ch='a';ch<='z';ch++){
if(s[ch]>0){
printf("%c:%d\n",ch,s[ch]);
}
}
return 0;
}
输入abc abc def
abab ccc
ccc ccc
输出a:4
b:4
c:11
d:1
e:1
f:1
42.给出一个n*m的二维网格,求2*2方格的个数,方格里面的字符可以直接构成'face'。
#include
int main(){
int m,n,sum=0;
char a[100][100];
scanf("%d %d",&n,&m);
for(int i=0;i
}
for(int i=0;i
sum++;
}
}
printf("%d\n",sum);
return 0;
}
输入2 3
fac
cef
输出2
***43.求质数的个数。第一行输入一个整数t,表示询问的个数,接下来t行每行输入一个整数n,输出小于等于n的质数的个数。
#include
int a[1000001];
int main(){
int t,i,j,s=0;
scanf("%d",&t);
for(i=2;i<1000001;i++){
for(j=2;j*j<=i;j++){
if(i%j==0) break;
}
if(j*j>i) s++;
a[i]=s;
}
while(t--){
scanf("%d",&i);
printf("%d\n",a[i]);
}
return 0;
}
输入2
10
1000000
输出4
78498
注:这里为什么求质数只需要循环到该数的平方根?
原因在于:如果一个数的约数在其开平方的右边 则必然会存在一个约数在其开平方的左边 所以
判断一个数是否为质数 只需要观察在其2 到 开平方数中间是否含有约数即可。
***44.约瑟夫环:n个人(0,1,2,3,4...n-1),围成一圈,从编号为k的人开始报数,报数报到m的人出队(报数是1,2,...m这样报的)。下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人就是大王。现在,给定n,k,m,
请你求出大王的编号。
输入一行包含三个整数n,k,m
输出一个整数表示大王编号。
#include
int main(){
int m,n,k,i,j=1,s[100];
scanf("%d %d %d",&n,&k,&m);
for(i=0;i
for(i=k;count>1;i++){ /*这种循环设置是为了i一直从头到尾循环永不停歇*/
if(i==n) i=0; /*如果索引超出范围,又从头开始*/
if(s[i]!=0){/*如果没出圈,就是一,报数变量j就会叫,不是,又继续循环,j不叫*/
if(j==m){ /*j就是报数的数字,1 2 3 4 5 6 7 ....m*/
count--;
j=1;
s[i]=0;
}
else{
j++; /*只要报的数字不等于m,j就一直报数*/
}
}
}
for(i=0;i
}
return 0;
}
***45.实现10个数最大的最小的相加,次大的和次小的相加,写入文件。
#include
#include
int main(){
FILE *fp;
if((fp=fopen("max_min.txt","w+"))==NULL){
printf("文件无法打开\n");
exit(0);
}
int i,j,temp,a[10];
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(i=0;i<10;i++){//排序
for(j=0;j<9-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
fprintf(fp,"\n");//可以在文件中实现换行操作
for(i=0;i<10;i++){
fprintf(fp,"%d ",a[i]);
}
for(i=0;i<5;i++){
fprintf(fp,"\n%d",a[i]+a[9-i]);
}
fclose(fp);
return 0;
}
输入
10 20 30 40 50 60 70 80 90 100
输出
110
110
110
110
110