题目一
题目说明:对一个数做若干次交换,直到这个数只剩下一个数字,交换的规则是,将这个数变为所有位数上的数字的乘积,比如285经过一次变换之后转换成2*8*5=80,问题是,要做多少次变换,使得这个数变成个位数
输入描述:输入一个正整数,小于等于2,000,000,000
输出描述:输出一个整数,表示变换次数
输入例子:285
输出例子:2
代码如下:
#include<stdio.h>
#include<stdlib.h>
int w[10];
int split(int num);
int split(int num) {
int i = 0;
while(num) {
w[i++] = num % 10;
num = num / 10;
}
return i;
}
void main() {
int num, i = 0;
int j = 0, count = 0, index = 0;
scanf("%d", &num);
while(num >= 10) {
index = split(num);
count++;
num = 1;
for(j = 0; j < index; j++) {
num = num * w[j];
}
}
printf("%d", count);
}
题目二
给出一个区间[a, b],计算区间内神奇数的个数,神奇数的定义,存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。比如,153,可以使用数字3和数字1组成13,13是质数,满足神奇数,同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数
输入描述:输入两个整数a和b,代表[a, b]区间(i <= a <= b <= 10000)
输出描述:输出为一个整数,表示区间内满足条件的整数的个数
输入例子:11 20
输出例子:6
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int w[5];
int isPrime(int num);
int quert(int num);
int isneed(int index);
void clear();
void clear() {
int i;
for(i = 0; i < 5; i++) {
w[i] = 0;
}
}
int isneed(int index){
int num = 0, i, j;
int b = 1, q;
int flag = 0;
for(i = 0; i < index-1; i++) {
for(j = i + 1; j < index; j++) {
q = w[i] * 10 + w[j];
if(q >= 10 && isPrime(q) == 1) {
printf("q: %d ", q);
flag = 1;
break;
}
q = w[j] * 10 + w[i];
if(q >= 10 && isPrime(q) == 1) {
printf("q1: %d ", q);
flag = 1;
break;
}
}
}
return flag;
}
int quert(int num) {
int i = 0;
while(num) {
w[i++] = num % 10;
num = num / 10;
}
return i;
}
int isPrime(int num) {
int i, flag = 0;
for(i = 2; i < sqrt(num); i++) {
if(num % i == 0) {
flag = 1;
break;
}
}
return !flag;
}
void main(void) {
int min, max, num, flag = 0, count = 0;
scanf("%d%d", &min, &max);
for(num = min; num <= max; num++) {
int index = quert(num);
flag = isneed(index);
clear();
if(flag == 1) {
count++;
flag = 0;
}
}
printf("count: %d\n", count);
}