73 纯粹合数
作者: 朱凯时间限制: 10S章节: 字符串
问题描述 :
明明的爸爸是一位数学家,明明受他爸爸的影响从小就喜欢数学,经常向他爸爸学习或请教数学问题。
一天,明明问他爸爸什么是合数,明明的爸爸回答说:“首先,合数都是大于1的整数,其次合数是除了1和其本身外,还能被至少一个其他自然数整除的数,例如‘4’这个数,它除了能被1和4整除外,还能被2整除,因此‘4’就是合数;但是‘3’就不是合数,因为3只能被1和3这两个数整除,因此‘3’不是合数。”
聪明的明明很快就理解了他爸爸的意思,于是又接着问他爸爸:“那什么又是纯粹合数呢?”明明的爸爸接着回答说:“一个合数,去掉最高位,剩下的数是0或仍是合数;再去掉剩下的数的最高位,剩下的数还是0或合数;这样反复,一直到最后剩下的一位数仍为0或合数;我们把这样的数称为纯粹合数。
例如‘100’这个数,它能被1、2、4、5、10、20、50、100整除,因此100是个合数,我们去掉它的最高位,剩下的数是0(其实剩下的应该是00,但是前置0对一个整数来说没有意义,因此前置0被舍去,就剩下个位数上的0),因此‘100’是一个纯粹合数。有趣的是,100是最小的一个三位纯粹合数。
再例如‘104’这个数,104能被1、2、8、13、26、52、104整除,所以104是个合数;我们去掉它的最高位后剩下4,4能被1、2、4整除,所以4也是合数,所以‘104’是一个纯粹合数。
但是‘101’就不是纯粹合数,因为‘101’只能被1和101这两个数整除。”
明明对他爸爸的回答很满意,于是自己动手从100开始寻找纯粹合数,他一共找到了100个纯粹合数,调皮的明明开始反过来考爸爸了,问他爸爸能否告诉他第2个大于等于100的纯粹合数是哪个?第3个大于等于100的纯粹合数又是哪个?……明明的爸爸被这个突如其来的问题给难住了,他无法立刻回答出来,于是请求你的帮助,帮助他回答明明的这个问题。
明明的问题可以归结为:根据一个正整数n,求出从100开始从小到大的第n个纯粹合数。
输入说明 :
你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1 ≤ n ≤ 100)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序需要计算出一组相应的运算结果,并将每组运算结果依次写入到标准输出设备(通常为启动该程序的文本终端,例如Windows中的命令行终端)中。每组运算结果为一个整数,即从100开始从小到大的第n个纯粹合数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
输入范例 :
10
2
1
输出范例 :
124
104
100
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define m(n) mutilply(n);
int res[101];
int isHeShu(int n);
void allHeShu();
int mutilply(int n);
int main(){
allHeShu();
int n;
while(~scanf("%d",&n)){
printf("%d\n",res[n]);
}
return 0;
}
//1~100之间的合数
void allHeShu(){
int i=100,j=1,flag,len,temp;
char str[10];
res[j++]=i;
while(i++){
if(!isHeShu(i))continue;
temp=i;
flag=0;
while(temp>=0){
if(temp==0||(temp<=10&&isHeShu(temp))){
flag=1;
break;
}
itoa(temp,str,10);
len=strlen(str);
temp-=(str[0]-'0')*m(len-1);
if(!isHeShu(temp)&&temp!=0){
break;
}
}
if(flag){
res[j++]=i;
}
if(j==101){
break;
}
}
}
int isHeShu(int n){
if(n==1||n==2||n==3){
return 0;
}
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
return 1;
}
}
return 0;
}
int mutilply(int n){
int sum=1;
for(int i=1;i<=n;i++){
sum*=10;
}
if(sum==1){
return 0;
}
return sum;
}