编程练习
给定条件的整数集
给定不超过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",÷nd,&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;
}