C语言编程练习

编程练习

给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行未不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

思路

1.首先需要定义一个数字a用来存放输入的数字

#include<stdio.h>
int main(){
    int a;
    scanf("%a",&a);
    
    return 0;       
}

2.接下来我们需要做一个三位数,这个三位数每一位都有可能是a,a+1,a+2,a+3.显然这里需要有三重的循环,每一轮的循环能够让它从a走到a+3。于是我们定义三个变量i,j,k并构建这个三成循环。

#include<stdio.h>
int main(){
    int a;
    scanf("%a",&a);
    int i,j,k;
    i=a;
    while(i<=a+3){
        j=a;
        while(j<=a+3){
            k=a;
            while(k<=a+3){
                k++;         //三重循环,这里可以获取所有的数
            }
            j++;
        }
        i++;
    }
    return 0;       
}	

3.现在我们得到了三个数字,需要剔除掉重复的数字

#include<stdio.h>
int main(){
    int a;
    scanf("%a",&a);
    int i,j,k;
    i=a;
    while(i<=a+3){
        j=a;
        while(j<=a+3){
            k=a;
            while(k<=a+3){
                if(i!=j){
                    if(i!=k){
                        if(j!=k){
                            printf("%d%d%d",i,j,k);
                        }
                    }
                }
                k++;       
            }
            j++;
        }
        i++;
    }
    return 0;       
}	

4.因为数字之间要有一个空格,同时每6个要有一个回车。因此我们要有一个计数器,知道什么时候到了第六个。

#include<stdio.h>
int main(){
    int a;
    scanf("%d,&a);
    int i,j,k;
    int cnt=0;
    
    i=a;
    while(i<=a+3){
        j=a;
        while(j<=a+3){
            k=a;
            while(k<=a+3){
                if(i!=j){
                    if(i!=k){
                        if(j!=k){
                            cnt++;
                            printf("%d%d%d",i,j,k);
                            if(cnt==6){
                                printf("\n");
                                cnt=0;
                            }else{
                                printf(" ");//满六个输出换行,否则输出空格
                            }
                        }
                    }
                }
                k++;       
            }
            j++;
        }
        i++;
    }
    return 0;       
}	

水仙花数

水仙花数是指一个N位正整数(N>=3) ,它的每个位上的数字的N次幂之和等于它本身。例如:153= 13 + 53+ 33。本题要求编写程序计算所有N位水仙花数。

输入格式

输入在一行中给出一个正整数N(3<=N<=7)

输出格式

按递增顺序输出左右N位水仙花数,每个数字占一行

#include<stdio.h>
int main()
{
    int n=0;
    printf("请输入一个大于等于3小于等于7的正整数:");
	scanf("%d",&n); 
	//以n=3为例。
	//1.遍历所有的三位数100-999
	//2.怎么从3这个信息得到100 
	//  可以用1*10*10得到 ,乘两次10 
	int i=1;
	int first=1;
	while(i<n){
		first=first*10;
		i++;
	}//得到first等于100 
	//printf("first=%d",first);
	//从100得到1000,可以用100*10,即first*10
	i=first;
	while(i<first*10) {//3.得到100-999之间 
		//4.分解i的每位数,算出它们的n次幂然后求和 
		int t=i;//用t记录i,因为要将i分解,i会被破坏
		int sum=0;//求和 
		do{
			int d=t%10;
			t=t/10;
			//计算幂次,需要将d乘以自己的n-1遍
			//例:d*d d乘了一次自己得到了d的二次幂 
			int p=d;//p用来表达幂次的结果 
			int j=1;
			while(j<n){
				p=p*d;
				j++;
			}
			sum=sum+p;
		}while(t>0); 
		if(sum==i){  //看幂次和与原来的数是否相等 
			printf("%d\n",i);
		}
		i++;
	}
    return 0;
}

九九乘法表

在这里插入图片描述

本题要求对任意给定的1位正整数N ,输出从1* 1到N*N的部分口诀表。

输入格式

输入在一行中给出一个正整数N( 1<=N<=9 )

输出格式

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			printf("%d*%d=%d ",j,i,i*j);
			if(i*j<10){
				printf("   ");
			}else{
				printf("  ");
			}
		}
		printf("\n");
	}
	return 0;
}

统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出2个正整数M和N( 1<=M<=N<=500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
1031
输出样例:
7 143

1.比较m、n大小

2.找出从1到较大数字的素数

3.判断这些数字是否大于较小的数(找出m\n之间的所有素数)

#include<stdio.h>
int main(){
	int m=0;
	int n=0;
	scanf("%d %d",&m,&n);
	int sum=0;
	int count=0;
	
	for(int i=m;i<=n;i++){
		int isprime=1;
		int k;
		for(k=2;k<i-1;k++){
			if(i%k==0){
				isprime=0;
				break;
			}
		}
		if(isprime){
			sum=sum+i;
			count++;
			printf("%d ",i);				
		}
	}
	printf("%d %d",count,sum);
	return 0;
}

猜数游戏

猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”) , 还是小了(“Too small”) , 相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示" Bingo!" ;如果3次以内猜到该数,则提示"Lucky You!" ;如果超过3次但是在N (>3)次以内(包括第N次)猜到该数,则提示"Good Guess!" ;如果超过N次都没有猜到,则提示"Game Over",并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over",并结束程序。
输入格式:
输入第一行中给出2个不超过100的正整数 ,分别是系统产生的随机数、以及猜测的最大次数N。随后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或"Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2

输出样例

Too big

Too small

Too small

Good Guess

#include<stdio.h>
int main()
{
	int number,n;
	int inp;
	int finished=0;//用来控制循环是否退出 
	int cnt=0;
	scanf("%d %d",&number,&n);
	do{
		scanf("%d",&inp);
		cnt++;
		if(inp<0){
			printf("Game Over\n");
			finished=1;
		}else if(inp>number){
			printf("Too big\n");
		}else if(inp<number){
			printf("Too small\n");
		}else{
			if(cnt==1){
				printf("Bingo!\n");
			}else if(cnt<=3){
				printf("Lucky You!\n");
			}else{
				printf("Good Guess!\n");
			}
			finished=1;
		}
		if(cnt==n){
			if(!finished){
				printf("Game Over\n");
				finished=1;
			}
		}
	}while(!finished);
	return 0;
}

求序列前N项和

本题要求编写程序,计算序列2/1+3/2+5/3+8/5+…的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和, 分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后2位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66

#include<stdio.h>
int main()
{
	int n=0;
	scanf("%d",&n);
	double i=2;//分子 
	double sum=0.0;
	double j=1;//分母
	double t=0;
	int count=1; 
	while(count<=n){
		count++;
		sum=sum+i/j;
		t=i;
		i=i+j;
		j=t;
		printf("%d %d\n",i,j);
	}
	printf("%.2f",sum);
	return 0;
 } 
#include<stdio.h>
int main()
{
    int n;
    double dividend=2;
	double divisor=1;
    double sum=0.0;
    int i;
    double t;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        sum+=dividend/divisor;
        t=dividend;
        dividend=dividend+divisor;
        divisor=t;
    }
    printf("%.2f\n",sum);
    return 0;
}

约分最简分式

分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8 ;而当分子分母相等时,
仍然表达为1/1的分数形式。
输入格式:

  • 输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如: 12/34 表示34分之12。分子和分母都是正整数(不包含0 ,如果不清楚正整数的定义的话)。
  • 提示:在scanf的格式字符串中加入"/”,让scanf来处理这个斜杠。

输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如5/6表示6分之5。
输入样例:
60/120
输出样例:

1/2

#include<stdio.h>
int main()
{
	int dividend,divisor;
	scanf("%d/%d",&dividend,&divisor);
	int a=dividend;
	int b=divisor;
	int t;
	while(b>0){
		t=a%b;
		a=b;
		b=t;
	}
	printf("%d/%d",dividend/a,divisor/a);
	return 0;
}

念数字

输入-个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: Wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如: 1234 。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行未没有最后的空格。如yi er san si.
输入样例:
-600

#include<stdio.h>
int main()
{
	int x;
	scanf("%d",&x);
	if(x<0){
		printf("fu ");
		x=-x;
	}
	int mask=1;
	int t=x;
	while(t>9){
		t/=10;
		mask*=10;
	}
	do{
		int d=x/mask;
		switch(d){
			case 0:printf("ling");break;
			case 1:printf("yi");break;
			case 2:printf("er");break;
			case 3:printf("san");break;
			case 4:printf("si");break;
			case 5:printf("wu");break;
			case 6:printf("liu");break;
			case 7:printf("qi");break;
			case 8:printf("ba");break;
			case 9:printf("jiu");break;
		}
		if(mask>9)printf(" ");
		x%=mask;
		mask/=10;
	}while(mask>0);
	printf("\n");
	return 0;
}

求a的连续和

输入两个整数a和n , a的范围是[0,9] , n的范围是[1,8] ,求数列之和S = a+aa+…a…a ( n个a)。如a为2、 n为8时输出的是2+ 22+ 222+… +22222222的和。
输入格式:
输入在一行中给出两个整数,先后表示a和n。
输出格式:
在一行中输出要求的数列之和。
输入样例:
2 4
输出样例:
2468

#include<stdio.h>
int main()
{
	int a=0;
	int n=0;
	scanf("%d %d",&a,&n);
	int i=0;
	int sum=0;
	int t=0;
	for(i=0;i<n;i++){
		t=t*10+a;
		sum+=t;
	}
	printf("%d",sum);
	return 0;
}
	if(mask>9)printf(" ");
		x%=mask;
		mask/=10;
	}while(mask>0);
	printf("\n");
	return 0;
}

求a的连续和

输入两个整数a和n , a的范围是[0,9] , n的范围是[1,8] ,求数列之和S = a+aa+…a…a ( n个a)。如a为2、 n为8时输出的是2+ 22+ 222+… +22222222的和。
输入格式:
输入在一行中给出两个整数,先后表示a和n。
输出格式:
在一行中输出要求的数列之和。
输入样例:
2 4
输出样例:
2468

#include<stdio.h>
int main()
{
	int a=0;
	int n=0;
	scanf("%d %d",&a,&n);
	int i=0;
	int sum=0;
	int t=0;
	for(i=0;i<n;i++){
		t=t*10+a;
		sum+=t;
	}
	printf("%d",sum);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值