73 纯粹合数

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;
}
发布了142 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39910081/article/details/105163035
73