/*我们要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数最高位数字的一半; 3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
【输入】 第一行一个数t,表示有t组数据 之后每组数据占一行,每行一个数n
【输出】 每组数据占一行,一个数,表示满足条件的数的个数
【输入范例】1 6
【输出范例】6 */
#include<iostream>
#include <conio.h>
using namespace std;
int getwei(int x) //取一共多少位
{
int i=0;
while(x!=0)
{
x=x/10;
i+=1;
}
return i;
}
int getfirst(int x) //取数字的第一位
{
while(x>=10)
{
x=x/10;
}
return x;
}
void function(int x)
{ int i=1; //因为switch有3个分支分别为1位数,2位数和3位数。为了区分所以定义了7个变量
int j=0;
int p=1;
int q=0;
int m=1;
int n=0;
int h=1;
int num=1; //有几个满足条件的数字
int two; //2位数的首数字
int three; //3位数的首数字
int wei=getwei(x); //1,2,3
switch(wei)
{
case 1:
for(i;i<=x/2;i++)
{
if(x>=4)
{
cout<<10*i+x<<endl;
num+=1;
for(j=1;j<=i/2;j++)
{
cout<<100*j+10*i+x<<endl;
num+=1;
for(h=1;h<=j/2;h++)
{
cout<<1000*h+100*j+10*i+x<<endl;
num+=1;
}
}
}
else
{
cout<<100*j+10*i+x<<endl;
num+=1;
}
}
break;
case 2:
two=getfirst(x);
for(m;m<=two/2;m++)
{
if(two>=4)
{
cout<<100*m+x<<endl;
num+=1;
for(n=1;n<=m/2;n++)
{
cout<<1000*n+100*m+x<<endl;
num+=1;
for(h=1;h<=n/2;h++)
{
cout<<10000*h+1000*n+100*m+x<<endl;
num+=1;
}
}
}
else
{
cout<<1000*n+100*m+x<<endl;
num+=1;
}
}
break;
case 3:
three=getfirst(x);
for(p;p<=three/2;p++)
{
if(three>=4)
{
cout<<1000*p+x<<endl;
num+=1;
for(q=1;q<=p/2;q++)
{
cout<<10000*q+1000*p+x<<endl;
num+=1;
for(h=1;h<=q/2;h++)
{
cout<<100000*h+10000*q+1000*p+x<<endl;
num+=1;
}
}
}
else
{
cout<<10000*q+1000*p+x<<endl;
num+=1;
}
}
break;
}
cout<<"一共有多少个数:"<<num<<endl;
}
int main()
{
int num=1000;
bool first=true;
cout<<"SET NUM"<<endl;
while(num>=1000||num==1)
{ if(first)
{
cin>>num;
first=false;
}
else
{
cout<<"ERROR NUM"<<endl;
cin>>num;
}
}
function(num);
getch();
cout<<"满足条件的数为:"<<num<<endl;
}