C语言经典题目 —— 循环(二)

问题一、设有正整数n=d_{1}d_{2}...d_{n},0\leqslant d_{i}\leqslant 9 ,1\leqslant i\leqslant r,定义:maxdig(n) = max\left \{d _{1} d _{2}...d _{n}\right \},试写出任意正整数n求maxdig(n)的程序。

        该题思路就是用一个临时变量存储暂时的最大值,然后和下一位进行比较,如果小于下一位的位数,则此临时变量存储下一位的值,直到所有位循环完毕。代码如下:

int maxdig(int n){
	int max = n%10;
	while(n!=0){
		n /=10;
		if(max < n%10)        //max<当前位值则max=当前位值
			max = n % 10;
	}
	return max;
}

运行结果如下:

问题二、编写程序,求所有4位对称数,例如:9889。

        四位对称数只需要千位与个位相同发,十位与百位相同即可,从1000循环到9999成立的输出即可。代码如下:

void fourDc(){
	int i,num = 0;
	for(i = 1000;i<=9999;i++){
		if(i%10 == i/1000 && i/10%10 == i/100%10){//千位与个位相同,百位与十位相同
			printf("%d ",i);
			num++;
			if(num%10 == 0)	printf("\n");         //每够10个数换一次行
		}
	}
}

程序运行结果如下:

问题三、编写程序,判断正整数n是否为对称数。

        位数不确定时,则需要保存n的每一位,之后来判断是否为对称数,具体做法是先用数组按顺序保存n的每一位,再判断这个数组是否为对称数组,代码如下:

int isDc(int n){
	if(n>0 && n<10)	return 1;                    //只有一位一定是对称数
	int* array = (int*)malloc(sizeof(int)*11);   //数组保存每一位
	int length = 0;                              //记录位数
	while(n!=0){                                 //循环保存每一位
		array[length++] = n%10;
		n /= 10;
	}
	int i;
	for(i = 0;i < length/2;i++){                 
		if(array[i] != array[length-1-i])	return 0;  //比较对称两项的值是否相等
	}
	return 1;
}

 程序运行结果如下:

问题四、编写程序,打印所有小于n且可以被m整除的自然数。

         此题目简单,不做赘述,代码如下:

int dm(int n,int m){
	int i;
	for(i = 1;i < n;i++){
		if(i%m == 0){
			printf("%d ",i);
		}	
	}
	printf("\n");
}

        结果如下:

问题五、编写程序,打印所有个位数为6且能被3整除的小于n的自然数。

        和问题四解法类似,只需要将输出的条件变:i%3 == 0 && i %10 == 6即可。代码如下:

int d(int n){
	int i;
	for(i = 1;i < n;i++){
		if(i%3 == 0 && i%10 == 6){
			printf("%d ",i);
		}	
	}
	printf("\n");
}

        结果如下:

问题六、编写程序输出前n对孪生素数。若两素数之差为2,则为孪生素数,如(3,5)、(11,13)。

        首先考虑如何判断一个数是素数,即除了自身和1没有其他约数,则从\frac{i}{2}循环至2判断余数是否为0,第二步则是用一个临时变量temp保存访问的上一个素数,再寻找这个素数的下一个素数,两素数相减等于2则输出,然后将temp值变更为当前访问的值,以此循环,代码如下:

int sNumber(int x){                    //判断一个数是不是素数,是为1,否为0
	int i;
	for(i = x/2;i > 1;i--){
		if(x%i == 0)	return 0;
	}
	return 1;
}

int printTwinsNumber(int n){        
	int temp1 = 2;
	int num = 0;
	int i;
	while(num < n){
		for(i = temp1+1;!sNumber(i);i++);    //循环寻找下一个素数
		if(i-temp1 == 2){                    //相减等于2则输出
			printf("<%d,%d> ",temp1,i);
			num++;                           //统计数目
		}
		temp1 = i;                           //临时变量改为当前访问的素数
	}
}

运行结果如下:

问题七、编写程序,打印所有3位Armstrong数,即其值等于它本身每位数字立方和的数,例如:153 = 1^3+5^3+3^3

        固定位数所以简单获取位数循环即可,代码如下:

int lf(int i){                              //计算立方函数
	return i*i*i;
}

void printArmstrong(){
	int i = 100;
	for(;i<1000;i++){
		if(i == lf(i%10) + lf(i/10%10) + lf(i/100)){    //循环输出
			printf("%d ",i);
		}
	}
}

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值