C语言练习题(三)

来源:互联网 发布:淘宝企业店铺能转让吗 编辑:程序博客网 时间:2024/05/21 17:12

练习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);老报错:未出现标识符temp2if(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   112    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");}}
编译结果:

原创粉丝点击