问题一、设有正整数
,定义:
,试写出任意正整数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没有其他约数,则从循环至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数,即其值等于它本身每位数字立方和的数,例如:
。
固定位数所以简单获取位数循环即可,代码如下:
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);
}
}
}
运行结果如下: