34 特殊四位数
作者: 孙辞海 时间限制: 10S章节: 一维数组
问题描述 :
数学一直是明明很喜欢的一门学科,不但上课认真听讲,而且还自己钻研。有一次,老师在课上讲了一种特殊的四位整数,这种整数有两个特性:
第一,它是某一个自然数的平方;
第二,它的千位数字与十位数字之和等于百位数字与个位数字之积。
然后老师就举了一个例子:1156,1156是34的平方,且1156的千位数字1加上十位数字5等于百位数字1乘以个数数字6,即1+5=1*6。
然后老师告诉同学,这是最小的一个符合以上两个特性的四位整数,接着老师就留下了作业,要让同学们回家后尽量多的找出符合这两个特性的特殊四位数。明明回家后,就开始找了起来,1157、1158、1159、……、3136,直到到了3136(3136=5656,3+3=16),明明才找到了第二个这样的特殊四位数。明明觉得这样找下去不是办法,后面还有好几千个数字要一个一个试下来,这样一定无法在睡觉前完成。于是明明就求助于你,帮他写一个程序,从小到大求出所有的这样的特殊四位数,然后当明明想要第几个这样的特殊四位数时,你就能够很快的告诉他。 如果把上述所有的特殊四位数按从小到大的顺序排列后记为S1,S2,…,Sn,…,即排在第1个位置上的特殊四位数记为S1,排在第2个位置上的特殊四位数记为S2,…,排在第n个位置上的特殊四位数记为Sn,那么明明的问题可以归结为:假如一个特殊四位数排在第n个位置上,那么这个特殊四位数Sn等于多少呢?
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个正整数n(n不大于特殊四位数的个数),表示要求第n个特殊四位数Sn。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个正整数,表示与输入数据n相对应的那个特殊四位数Sn,每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
输入范例 :
1
2
输出范例 :
1156
3136
#include<stdio.h>
#include<math.h>
//判断一个数是否是自然数平方
int fun(int n){
int sum=1;
n-=sum;
while(n>0){
sum+=2;
n-=sum;
}
if(n==0){
return 1;
}
return 0;
}
int main(){
int n,count,i,a,num,sum,multiply,temp;
while(scanf("%d",&n)!=EOF){
count=0;
for(i=1000;i<10000;i++){
if(!fun(i)){
continue;
}
//千位数字与十位数字之和=/百位数字与个位数字之积
num=0;
sum=0;
multiply=1;
temp=i;
while(temp){
num++;
a=temp%10;
temp/=10;
if(num%2==0){
//十位 千位之和
sum+=a;
}else{
//个位 百位之积
multiply*=a;
}
}
if(sum==multiply){
count++;
}
if(count==n){
printf("%d\n",i);
break;
}
}
}
return 0;
}