练习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");
}
}
编译结果: