C语言练习题(三)

练习1:

#include<stdio.h>
/*题目1:
   用标准C编程:找出整形数字a-b之间的素数,并打印出来。
   分析:理解素数的概念:除了1和自己本身可以被整除,其余均不能被整除
   思路:
         1)输入待检测的数据区间[a,b];
         2) 用for循环对a-b之间的数字进行遍历,i是属于[a,b]的区间的;
         3)判断:对当前的数据i进行判断,如果能被[2,i-1]之间的整数整除,则不是素数
		    直接跳出当前for循环,对一下数据进行判断
         4)如果当前数据不能被[2,i-1]之间所有的数整除,则说明此数据是素数,break;进行下一次循环
   代码设计:两个for循环:
	     外层:for循环是待遍历的数据;
	     内层:for循环是对当前数据进行遍历整除;          
             break:   跳出当前for循环
	     continue:跳出本次循环,进入下一次循环
细节问题:对i==2说明和i<2的说明 *///升级版:任意两个整数之间素数(-128-127之间的素数)
 main(void){int m;int n;int i;int count=0;//保存素数个数
 scanf("%d,%d",&m,&n); //输入两个整数 
 printf("%d-%d之间的素数为:",m,n);
 for(i=m;i<=n;i++){
	 if(i<2){
		 continue;
		 }else if(i==2){
			 printf("%d\t",i);
			 count++;//比较特殊
			 }else{
				 int j=2;
				 for(j=2;j<i;j++){//2--(i-1)之间进行遍历
				 if(i%j==0){
					 break;//不是素数,直接跳出循环,进行下一个数据判断
				 }else{ //如果不能整除,看当前待循环的整数是否是最后一个
				 if(j<i-1){
					 continue;//如果不是,继续遍历下一个待整除的数
				 }else{ //如果是说明是素数
				 printf("%d ",i);//不制表了 
				 count++;//计数 
				 break;//说明不是素数,对下一个数字进行判断(break要不要都可以)
			}
       }
	}
  }
}
	printf("\n");
	printf("%d-%d之间的素数个数:%d\n",m,n,count);
}

 

VS2010编译结果:

实例2:

/*
注意:1)两个整数的取值范围,为保险起见,我选用最大的整型
   
设计理念:最小公倍数=两个整数的乘积除以最大公约数
如何求最大公约数呢?
已知:两个整数:m、n
思路:1)先求两个整数的最小值:min
      2)用一个for循环(对[2,min]进行遍历),判断m%i==0&&n%i==0?
	  3)如果满足则先存储当前的i,则再判断对[2,min]是否遍历完了?
	  4)如果没有遍历完,也先保存i,继续下一次循环;
	  5)如果遍历完了,则此i就是最大公约数;
	  

*/
#include<stdio.h>
void main(void){
	long long int m=0;
	long long int n=0;
	long long int temp2=0;                        //(1)
	scanf_s("%lld,%lld",&m,&n);//输入两个整数(可以加些逻辑判断,如果输出的数不是非自然数呢?)
	temp2=(m>n?m:n);//存储最大值,疑问:为什么如果把(1)注释掉,此行语句为long long int temp2=(m>n?m:n);老报错:未出现标识符temp2
	
	if(m%n==0||n%m==0){  //特殊
		printf("最小公倍数是:%lld\n",temp2);//三元运算符(为什么始终执行不到这里)
	}else{//非特殊
	   long long int i=0;
	   long long int temp=0;          //存储两个数的最大公约数,那么如何求公约数呢?
	   long long int temp1=(m<n?m:n); //存储两个数最小的那个(为了阅读起来方便),比较郁闷的是m,n为什么不能放到if—else之外,难道没有局部变量和全局变量吗?
	   for(i=2;i<temp1;i++){
		if((n%i==0)&&(m%i==0)){   //如果均能被整除
		printf("%lld,%lld的",m,n);//为什么去掉此行就不能编译了(很纳闷)
			if(i<temp1-1){    //此时判断是否是最后一个数
			    temp=i;       //先临时存储一下(一旦这是最大的公约数,但仍未遍历完呢?)
				continue;     //如果不是最后一个数,继续遍历
			}else{
				temp=i;       //如果是最后一个数,则覆盖先前的数:是最大公约数
			}
		}else{ //继续遍历下一个
			continue;
		}
	}
	   printf("最小公倍数为:%lld\n",m*n/temp);
	}
	
}

编译结果:


练习3:

/*
3、		用标准C编程:输出杨辉三角形的前10行:三角形的每一行是(x+y)^n的展开式各项的系数。
例如:
第一行是(x+y)^0,其系数为1;
第二行是(x+y)^1,其系数为1;
第三行是(x+y)^2,其展开式为x2+2xy+y2,系数分别为1,2,1;
直观形式如下:
1 
1   1
1	2    1 
1 	3    3    1 
1 	4    6    4    1 
1 	5    10   10   5   1
分析:其实是打印如下形式:
   1)共有10行,每行的个数与行号关系
	  假设第i行,则第i行需要打印(2*i+1)个数字;
   2)观察迟子特点a[i,j]=a[i-1,j]+a[i-1,j-1];
   定义一个二维数组:int arr[][];
*/

#include<stdio.h>
void main(void ){
	int i;
	int j;
	int arr[10][10];                      //定义一个二维数组
	printf("杨辉三角的前10行的图案为:\n");
	for(i=0;i<10;i++){                    //数组(杨辉三角)的行数:10行
		for(j=0;j<=i;j++ ){               //杨辉三角每行的元素个数
		if(i==0){
			arr[i][j]=1;                  //如果是第一行的则为1
		}else{                            //如果不是第一行,则根据上一行的值计算当前每个元素的值
			int temp=0;                   //保存当前元素的值
			if(j>=1){                     //判断当前元素左上(j>=1)是否有元素
				temp+=arr[i-1][j-1];      //有则将元素上方的值加入到temp中
			}
			if(j<i){
				temp+=arr[i-1][j];        //判断当前元素右上(j<i)是否有元素
			}
			arr[i][j]=temp;               //有则将元素上方的值加入到temp中
		}
		}
	}
	for(i=0;i<10;i++){
		for(j=0;j<=i;j++){
			printf("%d\t",arr[i][j]);
		}
		printf("\n");
	}
}				
编译结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值