一、课程中包含的题目
01-1. 厘米换算英尺英寸(15)
#include <stdio.h>
int main(){
int cm=0;
scanf("%d",&cm);
int foot,inch;
foot=cm/30.48;//int直接要了整数部分
//和foot=cm/100/0.3048计算结果不一样,因为除法是只保留整数部分的,就变成1/0.3048
inch=(cm/30.48-foot)*12;
printf("%d %d",foot,inch);
return 0;
}
01-2. 然后是几点(15)
#include <stdio.h>
int main(){
int time1=0;//起始时间
int time2=0;//流逝的分钟数
scanf("%d %d",&time1,&time2);
int hour=time1/100; //去掉后两位 11 5
int minute=hour*60;//小时转换为分钟5*60=300 660
//要后两位
int min1=time1%100;//取余30 20
int min=minute+min1;//小时全部变成分钟 300+30=330 680
int time;
//时间在同一天也就是说不会出现min-time2<0的情况
time=min+time2;//330+110=440 680+110=790
int hour1=time/60;//440min/60=7h..20 790/60=13h..10
int minute1=time%60;
if (hour1<10){
printf("0%d",hour1);
}
else printf("%d",hour1);
//if else这部分也可以将前两位*100+后两位数得到
printf("%d",minute1);
return 0;
}
01-3. 逆序的三位数(10)

#include <stdio.h>
int main(){
int z=0;//346
scanf("%d",&z);
int a=z/100;//=3..46
int b=z%100/10; //46/10=4..6 也可以z/10%10=4
int c=z%100%10; //6 也可以z%10=6
z=c*100+b*10+a;
printf("%d",z);
return 0;
}
//如果用printf("%d%d%d",c,b,a);就会出现007的现象
01-4. BCD解密(10)
十进制的12 = 二进制 0000 1100 = 十六进制 0001 0010
十六进制 0001 0010(=12) 被当成二进制0001 0010转换为十进制 2+16=18
读入十进制 转换为二进制,把他当作十六进制转换为十进制
BCD数就是十六进制
#include <stdio.h>
int main(){
int N=0;//[0,153]
scanf("%d",&N);//153/2
int a[8]={0};
int i=0;
for(i=0;N/2>=0;i++){
a[i]=N%2;
if (N/2==0){
// printf("%d:%d\n",i,a[i]);
break;
}
N=N/2;
// printf("%d:%d\n",i,a[i]);
}
for(i=7;i>=0;i--){
printf("%d",a[i]);
}
return 0;
}
01-5. 超速判断(10)
02-1.成绩转换(15)
#include <stdio.h>
int main(){
int score;
scanf("%d",&score);
int s=score/10;
switch(s){
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
break;
}
return 0;
}
02-2.判断一个数字的位数是几?
#include <stdio.h>
int main(){
int x=0;
scanf("%d",&x);
int n=0;
n++;
x/=10;
while(x>0){
n++;
x/=10;
}
printf("%d",n);
return 0;
}
02-3.猜数游戏1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int number=0;//计算机随机产生的数
srand( (unsigned)time( NULL ) ); //初始化随机数
number=rand();//rand()会得到一个随机的整数
printf("%d\n",number);
int a=0;//用户输入的数
int count=0;//猜的次数
do{
count++;
printf("请输入你猜的数字:");
scanf("%d",&a);
if(number==a) {
printf("恭喜你猜对了\n");
}
else if(number<a){
printf("猜大了\n");
}
else {
printf("猜小了\n");
}
}while(number!=a);
printf("%d\n",count);
return 0;
}
关于随机函数:
利用srand((unsigned int)(time(NULL));产生不可预见的随机序列,
1)首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
//srand( (unsigned)time( NULL ) );
2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
//randNumber=rand(); //这里赋值给了randNumber
3)若需要产生1~100的数字,rand()%100+1就是。
x%n 的结果是 [0,n-1] 的一个整数,例如x%100得到的就是一个100以内的数。
02-4.算平均数
#include<stdio.h>
int main(){
int number=0;
int sum=0;
int count=0;
while(number!=-1){
sum+=number;
count++;
scanf("%d",&number);
}
printf("%d %d %f",sum,count-1,1.0*sum/(count-1));
return 0;
}
02-5.整数求逆
1、输出逆序是个数时会在前面加0的情况:
解法一:
#include<stdio.h>
int main(){
int number;
scanf("%d",&number);
int ret=0;
int x=0;
while(number>0){
x=number%10;//算个位
printf("%d",x);//如果这样输出的话,除了number是0的情况什么都不输出因为不进入while循环,别的都没问题
ret=ret*10+x;//逆序输出时把原数个位往前移一位再加原数前面的那个数
number=number/10;//去掉最后一位
}
return 0;
}
解法二:
#include<stdio.h>
int main(){
int number=0;
scanf("%d",&number);// 7
int x=0;
int ret=0;
while(number>0){
x=number%10;//算个位
ret=ret*10+x;//逆序输出时把原数个位往前移一位再加原数前面的那个数
number/=10;//去掉最后一位
}
printf("%d",ret);//输出ret,什么情况都会正确
return 0;
}
2、输出逆序是个数时不会在前面加0的情况:
#include<stdio.h>
int main(){
int x;
scanf("%d",&x);
int ret=0;
int digit=0;
while(x>0){
digit=x%10;//算个位
ret=ret*10+digit;//逆序输出时把原数个位往前移一位再加原数前面的那个数
x=x/10;//去掉最后一位
}
printf("%d",ret);
return 0;
}
02-6.计算阶乘
02-6-1.从1到n的阶乘
解法一、while循环:
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
int i=1;
int sum=1;
while(i<=n){
sum*=i;
i++;
}
printf("%d!=%d",n,sum);
return 0;
}
解法二、for循环:
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
int i=1;
int sum=1;
for(i=1;i<=n;i++){
sum*=i;
}
printf("%d!=%d",n,sum);
return 0;
}
02-6-2.从n到1的阶乘
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
int sum=1;
for(int i=n;i>=1;i--){
sum*=i;
}
printf("%d!=%d",n,sum);
return 0;
}
- 乘积的初始值为1,而不是0。
02-7.判断是不是素数
1不是素数,素数是只能被1和自己整除的数
#include<stdio.h>
int main(){
int digit=0;
scanf("%d",&digit);
int isPrime=1;//是素数
for(int i=2;i<=digit-1;i++) {
if(digit%i==0){
isPrime=0; //能被除1和本身以外的数字整除,不是素数
break;
}
}
if(isPrime==0||digit==1||digit<=0) printf("%d不是素数",digit);
else printf("%d是素数",digit);
return 0;
}
-
用一个数的值是1还是0判断是不是素数,而不是用循环变量判断素数
-
利用循环变量来判断素数为什么不好吗?
答:声明的变量调用的目的越单一越好,减少多处不同目的的调用造成的错误,也便于阅读理解; 使用循环变量需要在循环出口处再判断,可能执行无意义的循环,多次调用时效率低; isPrime值范围更小便于判断,循环变量和终点值的关系的判断更复杂。
- 从i=2开始循环直到输入的数字-1结束,直接跳过除以1和本身
02-7-1.输出100以内的素数
#include<stdio.h>
int main(){
int digit=0;
for(int digit=2;digit<=100;digit++) {//从2-100进入循环判断是不是素数,因为1不是素数
int isPrime=1;//是素数,要放在循环体内,因为要重置重新判断,不是才赋值为0
for(int i=2;i<=digit-1;i++) {//判断是否能被整除
if(digit%i==0){
isPrime=0; //能被除1和本身以外的数字整除,不是素数
continue;
}
}
if(isPrime==1) printf("%d ",digit);
}
return 0;
}
int isPrime=1;//要放在循环体内,因为要重置重新判断,不是素数才赋值为0 。
02-7-2.输出从2开始的前50个素数
#include<stdio.h>
int main(){
int digit=2;
int j=0;
while(j<=50){
int isPrime=1;//是素数,要在循环体内,因为要重置重新判断,不是才赋值为0
for(int i=2;i<=digit-1;i++) {//判断是否能被整除
if(digit%i==0){
isPrime=0; //能被除1和本身以外的数字整除,不是素数
break;//不是素数 ->跳出for循环,不进入下面的if语句(不输出),继续while循环
}
}
//遇到一个素数时,for循环里不会进入if语句->判断完不是素数,直接进入下一步-> if(isPrime==1) 输出
if(isPrime==1) {
printf("%d ",digit);//是素数
j++;
}
digit++;//放在前面的话,2就不在范围内
}
return 0;
}
- 注意j++、digit++、输出素数的位置。
02-8.凑硬币
输入一个小于10的金额,让计算机输出如何用1角、2角、5角凑出这个金额。
#include<stdio.h>
int main(){
int amount=0;
scanf("%d",&amount);//3元 30角
int one,two,five;
for(one=1;one<amount*10;one++){
for(two=1;two<amount*10/2;two++){
for(five=1;five<amount*10/5;five++){
if(one+two*2+five*5==amount*10){
printf("可以用%d个1角、%d个2角%d个5角凑成%d\n",one,two,five,amount);
}
}
}
}
return 0;
}
找到第一种情况就退出所有循环不再继续:
解法一、变换exit的值,查看是否是从最里层循环退出的:
#include<stdio.h>
int main(){
int amount=0;
scanf("%d",&amount);//3元 30角
int exit=0;
int one,two,five;
for(one=1;one<amount*10;one++){
for(two=1;two<amount*10/2;two++){
for(five=1;five<amount*10/5;five++){
if(one+two*2+five*5==amount*10){
printf("可以用%d个1角、%d个2角%d个5角凑成%d\n",one,two,five,amount);
exit=1;
break;//只让他离开了这个循环而进入了下一层循环
}
}
if(exit==1) break;
}
if(exit==1) break;
}
return 0;
}
解法二、使用goto从最里层循环退出到最外层循环:
#include<stdio.h>
int main(){
int amount=0;
scanf("%d",&amount);//3元 30角
int one,two,five;
for(one=1;one<amount*10;one++){
for(two=1;two<amount*10/2;two++){
for(five=1;five<amount*10/5;five++){
if(one+two*2+five*5==amount*10){
printf("可以用%d个1角、%d个2角%d个5角凑成%d\n",one,two,five,amount);
goto out;
}
}
}
}
out:
return 0;
}
03-1.求前n和
03-1.1.求上图式子前n项和
解法一、设置为double型
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
double sum=0;
for(double i=1;i<=n;i++){
sum+=1/i;
}
printf("%f",sum);
return 0;
}
解法二、除号两边设置有一个1.0自动转换类型:
i也可以是int型,这样就会变成:
- 1.0/i 1.0是浮点数,i是整型,会把i变成浮点数再计算
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
double sum=0;
for(int i=1;i<=n;i++){
sum+=1.0/i;//自动类型转换 当运算符的两边出现不一致的类型时,会自动转换成范围大的类型。
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
03-1.2.求上图式子前n项和
解法一、判断奇偶项改变加减号:
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
double sum=0;
for(int i=1;i<=n;i++){
if(i%2==0){//偶数项是-
sum-=1.0/i;
}
else sum+=1.0/i;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
解法二、用sign设定加减:
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
double sum=0;
int sign=1;
for(int i=1;i<=n;i++){
sum+=sign*1.0/i;
sign=-sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
也可以将sign定义为double,计算sum的时候就不需要*1.0了
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
double sum=0;
double sign=1;
for(int i=1;i<=n;i++){
sum+=sign/i;
sign=-sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
03-2.正序分解整数
解法一、不适用于700这样的数字:
#include<stdio.h>
int main(){
int x=0;
scanf("%d",&x);//13425
//让x倒序
int t=0;
do{
int d=x%10;//d=3 1
t=t*10+d;//52431
x/=10;//13 1 0
}while(x>0);
x=t;
//拆开输出
do{
int d=x%10;//1
printf("%d",d);//1
if(x>9){
printf(" ");
}
x/=10;
}while(x>0);
printf("\n");
return 0;
}
解法二:
#include<stdio.h>
int main(){
int x=0;
scanf("%d",&x);
//看x是几位数
int i=0;
for(i=10;;i*=10) {
if(x/i<1){
break;
}
}
i/=10;
do{
int d=x/i;
printf("%d",d);
if(i>0){
printf(" ");
}
x=x%i;
i/=10;
}while(i>0);
return 0;
}
03-3.逆序分解整数
800的逆序是“0 0 8”,最后一位后面不输出空格
#include<stdio.h>
int main(){
int x=0;
scanf("%d",&x);//13425
do{
int d=x%10;
printf("%d",d);
if(x>=10){
printf(" ");
}
x=x/10;
}while(x>0);
return 0;
}
800的逆序是8而不是008
#include<stdio.h>
int main(){
int x=0;
scanf("%d",&x);
int ret=0;
do{
int d=x%10;
ret=ret*10+d;
x=x/10;
}while(x>0);
printf("%d",ret);
return 0;
}
在头文件math.h中,调用sqrt函数求平方根,调用pow函数求幂。
result = pow(10, -2) # 计算10的-次幂次幂,结果为0.01。
sqrt表示开平方根,计算公式为:若一个非负数x的平方等于a,即x²=a,则这个数x叫做a的非负平方根,表示为sqrt(a)=x
03-4.求最大公约数
解法一:枚举
#include<stdio.h>
int main(){
int a=0;
int b=0;
scanf("%d %d",&a,&b);
//求ab中的最小值
int min=0;
if(a>=b){
min=b;
}
else min=a;
int t=0;
for(int i=1;i<=min;i++){
if(a%i==0&&b%i==0){
t=i;
}
}
printf("%d和%d的最大公约数是%d",a,b,t);
return 0;
}
解法二:辗转相除法或者也叫欧几里得演算法
运作原理:
如果b==0,计算结束,a就是最大公约数;
否则,计算a%b,让a等于b,而b等于那个余数,回到第一步。
动画演示:欧几里得演算法(辗转相除法)_哔哩哔哩_bilibili
#include<stdio.h>
int main(){
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int t=0;
while(b!=0){
t=a%b;
a=b;
b=t;
}
printf("最大公约数是%d",a);
return 0;
}
04-0.求给定条件的整数集
给定一个不超过6的正整数A,考虑从A开始的连续4个数字,请输出所有由他们组成的无重复的3位数。
while循环:
#include<stdio.h>
int main(){
int a=0;//2
scanf("%d",&a);//2345
int i,j,k;
i=a;
int t=0;
while(i<=a+3){
j=a;
while(j<=a+3){
k=a;
while(k<=a+3){
if(i!=j&&i!=k&&j!=k){
printf("%d",i*100+j*10+k);
t++;
if(t%6==0){
printf("\n");
}
else printf(" ");
}
k++;
}
j++;
}
i++;
}
return 0;
}
for循环:
#include<stdio.h>
int main(){
int a=0;//2
scanf("%d",&a);//2345
int i,j,k;
int t=0;
for(i=a;i<=a+3;i++){
for(j=a;j<=a+3;j++){
for(k=a;k<=a+3;k++){
if(i!=j && i!=k && k!=j){
printf("%d",i*100+j*10+k);
t++;
if(t%6==0){
printf("\n");
}
else printf(" ");
}
}
}
}
return 0;
}
04-1.水仙花数
#include<stdio.h>
#include<math.h>
int main(){
int n=0;
int sum=0;
scanf("%d",&n);
// [100,999],1000)
int digit=pow(10,n-1);//100
for(int number=pow(10,n-1)+1;number<pow(10,n);number++){
int num=number;
sum=0;
do{
int d=num/digit;//101/100=1 1/10=0 1/1=1
sum+=pow(d,n);//1 +0^3+1^3
num%=digit;//101%100=1 1%10=1 1%1=0
digit/=10;//10 1 0
}while(digit>=1);
digit=pow(10,n-1);//100
if(sum==number){
printf("%d\n",sum);
}
// else printf("不是水仙花数\n") ;
}
return 0;
}
04-2.打印九九口诀表
输出一个下三角的九九乘法表:
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n);
for(int j=1;j<=n;j++){
for(int i=1;i<=n;i++){
if(i<=j){
printf("%d*%d=%d ",i,j,i*j);
}
if(i==j){
printf("\n");
}
}
}
return 0;
}
04-3.统计素数求和
#include<stdio.h>
int main(){
int m=0;
int n=0;
scanf("%d %d",&m,&n);
//判断是不是素数
//4 6 8 9 10,1不是素数,能整除 除了1和本身以外的数
//2 3 5 7
int j=0;
int sum=0;
for(int number=m;number<=n;number++) {
int isPrime=1;//是素数
for(int i=2;i<number;i++){//i<number和i<=number-1都可以,因为只要判断到根号number就可以了,4、9这样的数字也一样
if(number%i==0){//能被1和本身以外的数字整除,不是素数
isPrime=0;//不是素数
break;
}
}
if(isPrime==0||number==1){
printf("%d不是素数\n",number);
}
else {
printf("%d是素数\n",number);
j++;
sum+=number;
}
}
printf("%d %d\n",j,sum);
return 0;
}
04-4.猜数游戏2
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
#include<stdio.h>
int main(){
int randNumber=0;
int n=0;
scanf("%d %d",&randNumber,&n); //系统产生的随机数,猜测的最大次数n
int i=0;
int digit=1;
while(digit>0&&i<=n){
scanf("%d",&digit);
i++;
if(digit>0&&digit>randNumber) printf("Too big\n");
else if(digit>0&&digit<randNumber) printf("Too small\n");
else if(digit>0&&digit==randNumber) break;
}
// printf("i=%d\n",i);
if(digit>0&&i==1) printf("Bingo!\n");
else if(digit>0&&i==2||i==3) printf("Lucky You!\n");
else if(digit>0&&i>73&&i<=n) printf("Good Guess!\n");
else if(digit>0&&i>n) printf("Game Over\n");
else if(i<n&&digit<=0) printf("Game Over\n");
return 0;
}
05-0.n项求和
#include<stdio.h>
int main(){
int n=0;
scanf("%d",&n); //系统产生的随机数,猜测的最大次数n
double a=2;//分子
double b=1;//分母
double sum=0;
//a 2 3 5
//b 1 2 3
//t 2 3 5
for(int i=0;i<n;i++){
sum+=a/b;
double t=a;
a=a+b;
b=t;
}
printf("%.2f",sum);
return 0;
}
05-1.约分最简分式
输出样例
1/2
解法一、枚举求最大公约数:
#include<stdio.h>
int main(){
int a=0;//分子
int b=0;//分母
scanf("%d/%d",&a,&b);
//a和b的求最大公约数
//法一、枚举:
int min=0;
if(a<b) min=a;
else min=b;
int num;//公约数
for(int i=1;i<=min;i++){
if(a%i==0&&b%i==0){
num=i;
}
}
//num是最大公约数
a/=num;
b/=num;
printf("num=%d,a/b=%d/%d",num,a,b);
return 0;
}
解法二、用辗转相除法求最大公约数
#include<stdio.h>
int main(){
int a=0;//分子
int b=0;//分母
scanf("%d/%d",&a,&b);
int c=a;
int d=b;
while(b!=0){
int t=a%b;
a=b;
b=t;
}
c/=a;
d/=a;
printf("%d/%d",c,d);
return 0;
}
05-2念数字
#include<stdio.h>
int main(){
int number=0;
scanf("%d",&number);
//如果是负数,提前输出负号,然后变为正数
if(number<0) {
printf("fu ");
number=-number;
}
//判断number是几位数
int i=10;
for(;number/i>=1;i*=10){
}
i=i/10;
// printf("%d",i);//1000
//正序拆开 一位一位循环
for(int j=i;j>=1;j/=10){//1000 100 10 1 0
int d=number/j;//最高位 d=1234/1000=1 234/100=2 34/10=3 4/1=4
number%=j;//number=1234%1000=234 234%100=34 34%10=4 4%1=0
// printf("%d",d);//1234
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;
default:printf("jiu");break;//9
}
if(j!=1) printf(" ");//不是最后一位
}
return 0;
}
05-3求a的连续和
#include<stdio.h>
int main(){
int a=0;
int n=0;
scanf("%d %d",&a,&n);//2 4
int sum=0;
int t=a;//t=2
for(int i=1;i<=n;i++){//i=1 2 3 4
sum+=t;//sum=2+22+
t=t*10+a;//t=22 222
}
printf("%d",sum);
return 0;
}
开始学习函数
06-1计算圆柱的体积
输入圆柱的高和半径,求原著的体积volume=Π*r^2*h,要求定义和调用函数cylinder(r,h)计算圆柱的体积。
#include<stdio.h>
#define PI 3.1415926
double cylinder(double r,double h){
double volume;
volume=PI*r*r*h;
return volume;
}
int main(){
double r,h;
scanf("%lf %lf",&r,&h);
double volume=cylinder(r,h);
printf("%.3f",volume);
return 0;
}
06-2判断n是否是完全平方数
#include<stdio.h>
int IsSquare(int n) {
//若n是完全平方数,则存在正整数m,使得m^2=n ,也有n=1+3+5+...+(2m-1)
for(int i=1;n>0;i+=2){
n=n-i;
}//25=1+3+5+7+9+11
if(n==0) return 1;//是完全平方数
else return 0;//不是完全平方数
}
int main(){
int n=0;
scanf("%d",&n);
if(IsSquare(n)==1) printf("是");
else printf("不是") ;
return 0;
}
06-3采用辗转相除法求最大公约数
定义函数gcd(int m,int n),计算m和n的最大公约数。
#include<stdio.h>
int gcd (int m,int n) {
// m n
// 30 36 30%36=30
// 36 30
while(n!=0){
int t=m%n;
m=n;
n=t;
}
return m;
}
int main(){
int numerator,denominator;//分子 分母
scanf("%d %d",&numerator,&denominator);
int a=gcd(numerator,denominator);
printf("%d",a);
return 0;
}
06-4数字金字塔
输入一个整数n,输出如下金字塔型的数字。金字塔样式如下:
#include<stdio.h>
void pyramid(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
printf(" ");
}
for(int k=1;k<=i;k++){
printf("%d ",i);
}
printf("\n");
}
}
int main(){
int n;
scanf("%d",&n);
pyramid(n);
return 0;
}
06-5复数运算
分别输入两个复数的实部与虚部,用函数实现计算两个复数之和与之积。
c1=x1+y1*i,c2=x2+y2*i,
则:c1+c2=(x1+x2)+(y1+y2)i;c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i,代码如下
#include<stdio.h>
double add(double x1,double y1,double x2,double y2){
double x=x1+x2;
double y=y1+y2;
printf("addition is %f+%fi\n",x,y);
return 0;
}
double prod(double x1,double y1,double x2,double y2){
double x=x1*x2-y1*y2;
double y=x1*y2+x2*y1;
printf("product is %f+%fi\n",x,y);
}
int main(){
double x1,x2,y1,y2;
// double c1=x1+y1*i;
// double c2=x2+y2*i;
scanf("%lf %lf",&x1,&y1);
scanf("%lf %lf",&x2,&y2);
add(x1,y1,x2,y2);
prod(x1,y1,x2,y2);
return 0;
}
开始学习数组
07-1输出所有大于平均值的数
07-2判断素数
之前的判断一个数x是否是素数,要从2~n-1,依次遍历,看是否有除了1和本身以外的数能被整除,这样的循环要循环n-1遍。
现在可以一次性判断n个数字是否是素数,先将1、偶数(能被2整除)判断为不是素数;再从3开始每次+2,到sqrt(x)判断,剩下的奇数能否被除1和本身以外的数整除。
也可以用已经得到的素数,判断新的x是否是素数。适合用于正在构造素数表的同时使用。例如求前一百个素数,初始化数组只有一个素数2,然后从3开始判断是否是素数。
题目:输出前100个素数(用已经得到的素数,判断新的x是否是素数。)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define Number 100
int isPrime(int x, int arr[], int count) {
int ret = 1;//是素数
for (int i = 0; i < count; i++) {
if (x % arr[i] == 0) {
ret = 0;//不是素数
break;
}
}
return ret;
}
int main() {
int arr[Number] = { 2 };//其余元素初始值=0
int count = 1;//下标
int x = 3;//需要判断的数
//调试
//{
// int i;
// printf("\t");
// //输出下标
// for (i = 0; i < Number; i++) {
// printf("%d\t", i);
// }
// printf("\n");
//}
while (count < Number) {//0~99 就是100个
if (isPrime(x, arr, count)) {
arr[count++] = x;//count先输出 后++
}
//调试代码
/* {
printf("x=%d \t", x);
int i;
for (i = 0; i < Number; i++) {
printf("%d\t", arr[i]);
}
printf("count=%d\t",count);
printf("\n");
}*/
x++;
}
//输出
for (int i = 0; i < Number; i++) {
printf("%d", arr[i]);
if ((i + 1) % 5) printf("\t");
else printf("\n");
}
return 0;
}
还有更进一步的优先算法来判断素数——欧拉筛
构造n以内(不含n)的素数表:
- 开辟prime[n],里面只有0或1,依次表示不是素数、是素数;下标表示数。初始化所有元素为1。
- 令x=2,若x是素数,则对(i=2;x * i < n ;i++)令prime[x * i] = 0 //以i++的形式将x的倍数筛出是素数的范围。
- 令x++,若x<n,重复上一步,否则结束。
可以只用一个数组解决,不需要用函数
#include <stdio.h>
#define Number 25
int main() {
int prime[Number];
//初始化
for (int i = 0; i < Number; i++) {
prime[i] = 1;//假设都是素数
}
//{1,1,/1,1,1,1,1,1,1,1,1 ,1 ,1 ,1,1}
// 0 1 /2 3 4 5 6 7 8 9 10 11 12 13
int x = 2;
while (x < Number) {
if (prime[x]) {
for (int i = 2; x * i < Number; i++) {//i是倍数,将x的i倍赋值为0
prime[x * i] = 0;
}
}
x++;
}
for (int i = 2; i < Number; i++) {
if (prime[i]) printf("%d ",i);
}
return 0;
}